diff --git a/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj b/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj
index d997dec2d505a521296382b34b7bb34d190823d3..1976bc6a22aaa410f743ebad2ff5036a36c3881d 100644
--- a/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj
+++ b/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj
@@ -210,12 +210,7 @@
-
- true
- true
- true
- true
-
+
true
true
diff --git a/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj.filters b/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj.filters
index 3ec6a87b889a433016bcac0ab4e8bdce70f64811..d7402d29cf3ec419e6402bd0bf131fe2bd77611b 100644
--- a/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj.filters
+++ b/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.vcxproj.filters
@@ -64,7 +64,7 @@
Shader
-
+
Shader
diff --git a/25-IBL-MultiInstance-Sphere/Shader/GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl b/25-IBL-MultiInstance-Sphere/Shader/GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl
index 03482a2b3c186de9517771d37c3bca9864d81252..bc8b72afab2644c89ebd864d3156868087ef146b 100644
--- a/25-IBL-MultiInstance-Sphere/Shader/GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl
+++ b/25-IBL-MultiInstance-Sphere/Shader/GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl
@@ -1,4 +1,4 @@
-#include "HDR_COLOR_CONV.hlsli"
+#include "0-1 HDR_COLOR_CONV.hlsli"
#include "GRS_PBR_Function.hlsli"
Texture2D g_txHDR : register(t0);
diff --git a/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl b/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl
index 49e1950ace222f4bbd14e85d195337c40031eb56..e3d9f83c185f313a960157a6fd6c271103b31634 100644
--- a/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl
+++ b/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl
@@ -1,6 +1,6 @@
#include "GRS_Scene_CB_Def.hlsli"
#include "GRS_PBR_Function.hlsli"
-#include "HDR_COLOR_CONV.hlsli"
+#include "0-1 HDR_COLOR_CONV.hlsli"
SamplerState g_sapLinear : register(s0);
TextureCube g_texSpecularCubemap : register(t0);
diff --git a/25-IBL-MultiInstance-Sphere/Shader/GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl b/25-IBL-MultiInstance-Sphere/Shader/GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl
index 29183fb6b1abdfe59294c7bb329d937ba4976a8c..8328fc2c1c78ef1b4e340fccd7e4d169da79a46a 100644
--- a/25-IBL-MultiInstance-Sphere/Shader/GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl
+++ b/25-IBL-MultiInstance-Sphere/Shader/GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl
@@ -1,4 +1,4 @@
-#include "HDR_COLOR_CONV.hlsli"
+#include "0-1 HDR_COLOR_CONV.hlsli"
#include "GRS_Scene_CB_Def.hlsli"
Texture2D g_Texture2DArray[] : register(t0);
diff --git a/25-IBL-MultiInstance-Sphere/Shader/GRS_SkyBox_With_Spherical_Map.hlsl b/25-IBL-MultiInstance-Sphere/Shader/GRS_SkyBox_With_Spherical_Map.hlsl
index fb0de8c97e7b52b6c9c732247acb3e97f6fb1fdf..3488629a230f5e77efaad98e8012b385377294d7 100644
--- a/25-IBL-MultiInstance-Sphere/Shader/GRS_SkyBox_With_Spherical_Map.hlsl
+++ b/25-IBL-MultiInstance-Sphere/Shader/GRS_SkyBox_With_Spherical_Map.hlsl
@@ -1,4 +1,4 @@
-#include "HDR_COLOR_CONV.hlsli"
+#include "0-1 HDR_COLOR_CONV.hlsli"
#include "GRS_Scene_CB_Def.hlsli"
#include "GRS_PBR_Function.hlsli"
diff --git a/26-Normal-Map-And-Tangent-Space/Shader/GRS_Normal_Map_PS_2_World_Space.hlsl b/26-Normal-Map-And-Tangent-Space/Shader/GRS_Normal_Map_PS_2_World_Space.hlsl
index a54365adf418ce9809d471fce4e4e1d565f23e5e..66440bcc8a28ffbead1ac10fe27acbd4b246a0df 100644
--- a/26-Normal-Map-And-Tangent-Space/Shader/GRS_Normal_Map_PS_2_World_Space.hlsl
+++ b/26-Normal-Map-And-Tangent-Space/Shader/GRS_Normal_Map_PS_2_World_Space.hlsl
@@ -21,7 +21,6 @@ float4 PSMain(ST_GRS_HLSL_PS_INPUT stPSInput) : SV_TARGET
// 逐像素法线
float3 N = g_texNormal.Sample(g_sapLinear, stPSInput.m_v2UV).xyz;
N = 2.0f * N - 1.0f;
- //N.y = -N.y; // for Opengl Normal Map Texture
N = normalize(N);
float3x3 mxTBN= { stPSInput.m_v3WTangent , stPSInput.m_v3WBitangent, stPSInput.m_v3WNormal };
diff --git a/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.cpp b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..16938bc4cfb3be99330a88026b9ab8f17f1739f7
--- /dev/null
+++ b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.cpp
@@ -0,0 +1,5819 @@
+#include
+#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
+#include
+#include
+#include
+#include //添加WTL支持 方便使用COM
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include
+#include //for d3d12
+#include
+#if defined(_DEBUG)
+#include
+#endif
+
+using namespace DirectX;
+using namespace Microsoft;
+using namespace Microsoft::WRL;
+
+#include "../Commons/GRS_Def.h"
+#include "../Commons/GRS_Mem.h"
+#include "../Commons/GRS_D3D12_Utility.h"
+#include "../Commons/GRS_Texture_Loader.h"
+#include "../Commons/CGRSD3DCompilerInclude.h"
+#include "../Commons/GRS_Mesh_Load_Txt.h"
+#include "../Commons/GRS_Assimp_Loader.h"
+
+#define STB_IMAGE_IMPLEMENTATION
+#include "../stb/stb_image.h" // for HDR Image File
+
+#pragma comment(lib, "dxguid.lib")
+#pragma comment(lib, "dxgi.lib")
+#pragma comment(lib, "d3d12.lib")
+#pragma comment(lib, "d3dcompiler.lib")
+
+#define GRS_WND_CLASS _T("GRS Game Window Class")
+#define GRS_WND_TITLE _T("GRS DirectX12 Sample: PBR IBL With Texture")
+
+// 定义该宏 就使用文件打开对话框选择需要加载的资源
+// 否则就使用默认的资源展示效果
+#define GRS_USE_DIR_DIALOG
+
+const UINT g_nFrameBackBufCount = 3u;
+
+struct ST_GRS_D3D12_DEVICE
+{
+ DWORD m_dwWndStyle;
+ INT m_iWndWidth;
+ INT m_iWndHeight;
+ HWND m_hWnd;
+ RECT m_rtWnd;
+ RECT m_rtWndClient;
+
+ const float m_faClearColor[4] = { 0.17647f, 0.549f, 0.941176f, 1.0f };
+ D3D_FEATURE_LEVEL m_emFeatureLevel = D3D_FEATURE_LEVEL_12_1;
+ ComPtr m_pIDXGIFactory6;
+ ComPtr m_pID3D12Device4;
+
+ ComPtr m_pIMainCMDQueue;
+ ComPtr m_pIMainCMDAlloc;
+ ComPtr m_pIMainCMDList;
+
+ BOOL m_bFullScreen;
+ BOOL m_bSupportTearing;
+
+ UINT m_nFrameIndex;
+ DXGI_FORMAT m_emRenderTargetFormat;
+ DXGI_FORMAT m_emDepthStencilFormat;
+
+ UINT m_nRTVDescriptorSize;
+ UINT m_nDSVDescriptorSize;
+ UINT m_nSamplerDescriptorSize;
+ UINT m_nCBVSRVDescriptorSize;
+
+ UINT64 m_n64FenceValue;
+ HANDLE m_hEventFence;
+
+ D3D12_VIEWPORT m_stViewPort;
+ D3D12_RECT m_stScissorRect;
+
+ ComPtr m_pIFence;
+ ComPtr m_pISwapChain3;
+ ComPtr m_pIRTVHeap;
+ ComPtr m_pIARenderTargets[g_nFrameBackBufCount];
+ ComPtr m_pIDSVHeap;
+ ComPtr m_pIDepthStencilBuffer;
+};
+
+// 利用GS 一次渲染Cube Map 的 6 个面 所以需要使用 GS Render Target Array 技术
+#define GRS_CUBE_MAP_FACE_CNT 6u
+#define GRS_LIGHT_COUNT 4u
+
+#define GRS_RTA_DEFAULT_SIZE_W 2048
+#define GRS_RTA_DEFAULT_SIZE_H 2048
+
+#define GRS_RTA_IBL_DIFFUSE_MAP_SIZE_W 256
+#define GRS_RTA_IBL_DIFFUSE_MAP_SIZE_H 256
+
+#define GRS_RTA_IBL_SPECULAR_MAP_SIZE_W 512
+#define GRS_RTA_IBL_SPECULAR_MAP_SIZE_H 512
+#define GRS_RTA_IBL_SPECULAR_MAP_MIP 5
+
+#define GRS_RTA_IBL_LUT_SIZE_W 512
+#define GRS_RTA_IBL_LUT_SIZE_H 512
+#define GRS_RTA_IBL_LUT_FORMAT DXGI_FORMAT_R32G32_FLOAT
+
+// Geometry Shader Render Target Array Struct
+struct ST_GRS_RENDER_TARGET_ARRAY_DATA
+{
+ UINT m_nRTWidth;
+ UINT m_nRTHeight;
+ D3D12_VIEWPORT m_stViewPort;
+ D3D12_RECT m_stScissorRect;
+
+ DXGI_FORMAT m_emRTAFormat;
+
+ D3D12_RESOURCE_BARRIER m_stRTABarriers;
+
+ ComPtr m_pIRTAHeap;
+ ComPtr m_pITextureRTA;
+ ComPtr m_pITextureRTADownload;
+};
+
+struct ST_GRS_PSO
+{
+ UINT m_nCnt;
+ UINT m_nCBVCnt;
+ UINT m_nSRVCnt;
+ UINT m_nSmpCnt;
+
+ ComPtr m_pIRS;
+ ComPtr m_pIPSO;
+
+ ComPtr m_pICmdAlloc;
+ ComPtr m_pICmdBundles;
+
+ ComPtr m_pICmdSignature;
+};
+
+struct ST_GRS_DESCRIPTOR_HEAP
+{
+ UINT m_nSRVOffset; // SRV Offset
+ //UINT m_nCnt;
+ //UINT m_nCBVCnt;
+ //UINT m_nSRVCnt;
+ //UINT m_nSmpCnt;
+
+ ComPtr m_pICBVSRVHeap; // CBV SRV Heap
+ ComPtr m_pISAPHeap; // Sample Heap
+};
+
+//#pragma pack()
+//#pragma pack(push,4)
+//#pragma pack(show)
+// Scene Matrix
+struct ST_GRS_CB_SCENE_MATRIX
+{
+ XMMATRIX m_mxWorld;
+ XMMATRIX m_mxView;
+ XMMATRIX m_mxProj;
+ XMMATRIX m_mxWorldView;
+ XMMATRIX m_mxWVP;
+ XMMATRIX m_mxInvWVP;
+ XMMATRIX m_mxVP;
+ XMMATRIX m_mxInvVP;
+};
+
+// GS 6 Direction Views
+struct ST_GRS_CB_GS_VIEW_MATRIX
+{
+ XMMATRIX m_mxGSCubeView[GRS_CUBE_MAP_FACE_CNT]; // Cube Map 6个 视方向的矩阵
+};
+
+// Material
+struct ST_GRS_PBR_MATERIAL
+{
+ float m_fMetallic; // 金属度
+ float m_fRoughness; // 粗糙度
+ float m_fAO; // 环境遮挡系数
+ XMVECTOR m_v4Albedo; // 反射率
+};
+
+// Camera
+struct ST_GRS_SCENE_CAMERA
+{
+ XMVECTOR m_v4EyePos;
+ XMVECTOR m_v4LookAt;
+ XMVECTOR m_v4UpDir;
+};
+
+// lights
+struct ST_GRS_SCENE_LIGHTS
+{
+ XMVECTOR m_v4LightPos[GRS_LIGHT_COUNT];
+ XMVECTOR m_v4LightColors[GRS_LIGHT_COUNT];
+};
+
+struct ST_GRS_VERTEX_CUBE_BOX
+{
+ XMFLOAT4 m_v4Position;
+};
+
+struct ST_GRS_VERTEX_QUAD
+{// 注意这个顶点结构保留Color的意思
+ // 是为了方便UI渲染时直接渲染一个颜色块出来,
+ // 这样就可以兼容颜色块或Texture,而不用再定义额外的结构体
+ // 也是向古老的HGE引擎致敬学习
+ XMFLOAT4 m_v4Position; //Position
+ XMFLOAT4 m_v4Color; //Color
+ XMFLOAT2 m_v2UV; //Texcoord
+};
+
+struct ST_GRS_VERTEX_QUAD_SIMPLE
+{
+ XMFLOAT4 m_v4Position; //Position
+ XMFLOAT2 m_v2UV; //Texcoord
+};
+
+//#pragma pack(pop)
+//#pragma pack(show)
+
+struct ST_GRS_SCENE_CONST_DATA
+{
+ ST_GRS_CB_SCENE_MATRIX* m_pstSceneMatrix;
+ ST_GRS_CB_GS_VIEW_MATRIX* m_pstGSViewMatrix;
+ ST_GRS_SCENE_CAMERA* m_pstSceneCamera;
+ ST_GRS_SCENE_LIGHTS* m_pstSceneLights;
+ ST_GRS_PBR_MATERIAL* m_pstPBRMaterial;
+
+ ComPtr m_pISceneMatrixBuffer;
+ ComPtr m_pISceneCameraBuffer;
+ ComPtr m_pISceneLightsBuffer;
+ ComPtr m_pIGSMatrixBuffer;
+ ComPtr m_pIPBRMaterialBuffer;
+};
+
+struct ST_GRS_TRIANGLE_LIST_DATA
+{
+ UINT m_nVertexCount;
+ UINT m_nIndexCount;
+
+ D3D12_VERTEX_BUFFER_VIEW m_stVBV = {};
+ D3D12_INDEX_BUFFER_VIEW m_stIBV = {};
+
+ ComPtr m_pIVB;
+ ComPtr m_pIIB;
+
+ ComPtr m_pITexture;
+};
+
+struct ST_GRS_TRIANGLE_STRIP_DATA
+{
+ UINT m_nVertexCount;
+ D3D12_VERTEX_BUFFER_VIEW m_stVertexBufferView;
+ ComPtr m_pIVertexBuffer;
+
+ ComPtr m_pITexture;
+ ComPtr m_pITextureUpload;
+};
+
+#define GRS_INSTANCE_DATA_SLOT_CNT 2
+
+struct ST_GRS_TRIANGLE_STRIP_DATA_WITH_INSTANCE
+{
+ UINT m_nVertexCount;
+ UINT m_nInstanceCount;
+ D3D12_VERTEX_BUFFER_VIEW m_pstVertexBufferView[GRS_INSTANCE_DATA_SLOT_CNT];
+ ComPtr m_ppIVertexBuffer[GRS_INSTANCE_DATA_SLOT_CNT];
+ CAtlArray> m_ppITexture;
+};
+
+struct ST_GRS_TRIANGLE_LIST_DATA_WITH_INSTANCE
+{
+ UINT m_nIndexCount;
+ UINT m_nInstanceCount;
+ D3D12_INDEX_BUFFER_VIEW m_stIBV;
+ ComPtr m_pIIB;
+ D3D12_VERTEX_BUFFER_VIEW m_pstVBV[GRS_INSTANCE_DATA_SLOT_CNT];
+ ComPtr m_ppIVB[GRS_INSTANCE_DATA_SLOT_CNT];
+
+ CAtlArray> m_ppITexture;
+};
+
+struct ST_GRS_MESH_DATA_MULTI_SLOT
+{
+ UINT m_nIndexCount;
+ DXGI_FORMAT m_emIndexType;
+
+ D3D12_INDEX_BUFFER_VIEW m_stIBV;
+ ComPtr m_pIIB;
+
+ CAtlArray m_arVBV;
+ CAtlArray> m_arIVB;
+};
+
+struct ST_GRS_PER_QUAD_INSTANCE_DATA
+{
+ XMMATRIX m_mxQuad2World;
+ UINT m_nTextureIndex;
+};
+
+struct ST_GRS_HDR_TEXTURE_DATA
+{
+ TCHAR m_pszHDRFile[MAX_PATH];
+ INT m_iHDRWidth;
+ INT m_iHDRHeight;
+ INT m_iHDRPXComponents;
+ FLOAT* m_pfHDRData;
+
+ DXGI_FORMAT m_emHDRFormat;
+ ComPtr m_pIHDRTextureRaw;
+ ComPtr m_pIHDRTextureRawUpload;
+};
+
+#define GRS_MODEL_DATA_CB_CNT 1
+#define GRS_PBR_MATERIAL_TEXTURE_CNT 6
+
+struct ST_GRS_MODEL_DATA
+{
+ XMMATRIX m_mxModel2World;
+};
+
+struct ST_GRS_SCENE_PBR_MATERIAL_MODEL_DATA
+{
+ union
+ {
+ struct
+ {
+ TCHAR m_pszAlbedo[MAX_PATH];
+ TCHAR m_pszNormal[MAX_PATH];
+ TCHAR m_pszDisplacement[MAX_PATH];
+ TCHAR m_pszMetallic[MAX_PATH];
+ TCHAR m_pszRoughness[MAX_PATH];
+ TCHAR m_pszAO[MAX_PATH];
+ };
+ TCHAR m_pszPBRMaterialPathName[GRS_PBR_MATERIAL_TEXTURE_CNT][MAX_PATH];
+ };
+ ST_GRS_MODEL_DATA* m_pstModelData;
+ ComPtr m_pIMaterialHeap;
+ CAtlArray> m_arTexMaterial;
+ CAtlArray> m_arTexMaterialUpload;
+ ComPtr m_pICBModelData;
+};
+
+struct ST_GRS_CAMERA
+{
+ XMVECTOR m_v4EyePos;
+ XMVECTOR m_v4LookDir;
+ XMVECTOR m_v4UpDir;
+
+ float m_fNear;
+ float m_fFar;
+};
+
+struct ST_GRS_CAMERA_CONTROL
+{
+ float m_fRadius;
+
+ XMVECTOR m_qCameraStart;
+ XMVECTOR m_qCameraMoves;
+ XMVECTOR m_vCameraPosStart;
+ XMVECTOR m_vCameraPosMoves;
+};
+
+ST_GRS_CAMERA g_stCamera = {};
+ST_GRS_CAMERA_CONTROL g_stCameraControl = {};
+
+BOOL g_bWorldRotate = TRUE;
+// 场景的旋转角速度(弧度/s)
+float g_fPalstance = 15.0f;
+// 场景旋转的角度:旋转角
+float g_fWorldRotateAngle = 0;
+
+BOOL g_bShowRTA = TRUE;
+BOOL g_bUseLight = FALSE;
+
+// 常见材质的线性反射率数组
+XMFLOAT4 g_v4Albedo[]
+= { {0.02f, 0.02f, 0.02f,1.0f}, //水
+ {0.03f, 0.03f, 0.03f,1.0f}, //塑料 / 玻璃(低)
+ {0.05f, 0.05f, 0.05f,1.0f}, //塑料(高)
+ {0.08f, 0.08f, 0.08f,1.0f}, //玻璃(高) / 红宝石
+ {0.17f, 0.17f, 0.17f,1.0f}, //钻石
+ {0.56f, 0.57f, 0.58f,1.0f}, //铁
+ {0.95f, 0.64f, 0.54f,1.0f}, //铜
+ {1.00f, 0.71f, 0.29f,1.0f}, //金
+ {0.91f, 0.92f, 0.92f,1.0f}, //铝
+ {0.95f, 0.93f, 0.88f,1.0f} //银
+};
+
+float g_fScale = 1.0f; // 加载物体的缩放比例 Z键放大 C键缩小
+
+D3D12_HEAP_PROPERTIES g_stDefaultHeapProps = {};
+D3D12_HEAP_PROPERTIES g_stUploadHeapProps = {};
+D3D12_RESOURCE_DESC g_stBufferResSesc = {};
+
+ST_GRS_D3D12_DEVICE g_stD3DDevice = {};
+
+ST_GRS_SCENE_CONST_DATA g_stWorldConstData = {};
+ST_GRS_SCENE_CONST_DATA g_stQuadConstData = {};
+
+ST_GRS_HDR_TEXTURE_DATA g_stHDRData = {};
+
+ST_GRS_RENDER_TARGET_ARRAY_DATA g_st1TimesGSRTAStatus = {};
+ST_GRS_DESCRIPTOR_HEAP g_st1TimesGSHeap = {};
+ST_GRS_PSO g_st1TimesGSPSO = {};
+ST_GRS_TRIANGLE_STRIP_DATA g_stBoxData_Strip = {};
+
+ST_GRS_RENDER_TARGET_ARRAY_DATA g_st6TimesRTAStatus = {};
+ST_GRS_DESCRIPTOR_HEAP g_stHDR2CubemapHeap = {};
+ST_GRS_PSO g_stHDR2CubemapPSO = {};
+ST_GRS_TRIANGLE_LIST_DATA g_stBoxData_Index = {};
+
+// IBL 慢反射预积分计算需要的数据结构
+ST_GRS_RENDER_TARGET_ARRAY_DATA g_stIBLDiffusePreIntRTA = {};
+ST_GRS_PSO g_stIBLDiffusePreIntPSO = {};
+
+// IBL 镜面反射预积分计算需要的数据结构
+ST_GRS_RENDER_TARGET_ARRAY_DATA g_stIBLSpecularPreIntRTA = {};
+ST_GRS_PSO g_stIBLSpecularPreIntPSO = {};
+
+// IBL 镜面反射LUT计算需要的数据结构
+ST_GRS_RENDER_TARGET_ARRAY_DATA g_stIBLLutRTA = {};
+ST_GRS_PSO g_stIBLLutPSO = {};
+ST_GRS_TRIANGLE_STRIP_DATA g_stIBLLutData = {};
+
+ST_GRS_DESCRIPTOR_HEAP g_stIBLHeap = {};
+ST_GRS_PSO g_stIBLPSO = {};
+ST_GRS_MESH_DATA_MULTI_SLOT g_stMultiMeshData = {};
+CAtlArray g_arPBRMaterial;
+
+ST_GRS_DESCRIPTOR_HEAP g_stSkyBoxHeap = {};
+ST_GRS_PSO g_stSkyBoxPSO = {};
+ST_GRS_TRIANGLE_STRIP_DATA g_stSkyBoxData = {};
+
+ST_GRS_DESCRIPTOR_HEAP g_stQuadHeap = {};
+ST_GRS_PSO g_stQuadPSO = {};
+ST_GRS_TRIANGLE_STRIP_DATA_WITH_INSTANCE g_stQuadData = {};
+
+
+
+TCHAR g_pszAppPath[MAX_PATH] = {};
+TCHAR g_pszShaderPath[MAX_PATH] = {};
+TCHAR g_pszHDRFilePath[MAX_PATH] = {};
+
+void OnSize(UINT width, UINT height, bool minimized);
+LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
+
+int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
+{
+ USES_CONVERSION;
+ try
+ {
+ ::CoInitialize(nullptr); //for WIC & COM
+
+ // 0-1、初始化全局参数
+ {
+ g_stD3DDevice.m_iWndWidth = 1280;
+ g_stD3DDevice.m_iWndHeight = 800;
+ g_stD3DDevice.m_hWnd = nullptr;
+ g_stD3DDevice.m_nFrameIndex = 0;
+ g_stD3DDevice.m_emRenderTargetFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
+ g_stD3DDevice.m_emDepthStencilFormat = DXGI_FORMAT_D32_FLOAT;
+ g_stD3DDevice.m_nRTVDescriptorSize = 0U;
+ g_stD3DDevice.m_nDSVDescriptorSize = 0U;
+ g_stD3DDevice.m_nSamplerDescriptorSize = 0u;
+ g_stD3DDevice.m_nCBVSRVDescriptorSize = 0u;
+ g_stD3DDevice.m_stViewPort = { 0.0f, 0.0f, static_cast(g_stD3DDevice.m_iWndWidth), static_cast(g_stD3DDevice.m_iWndHeight), D3D12_MIN_DEPTH, D3D12_MAX_DEPTH };
+ g_stD3DDevice.m_stScissorRect = { 0, 0, static_cast(g_stD3DDevice.m_iWndWidth), static_cast(g_stD3DDevice.m_iWndHeight) };
+ g_stD3DDevice.m_n64FenceValue = 0ui64;
+ g_stD3DDevice.m_hEventFence = nullptr;
+
+ g_stDefaultHeapProps.Type = D3D12_HEAP_TYPE_DEFAULT;
+ g_stDefaultHeapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
+ g_stDefaultHeapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
+ g_stDefaultHeapProps.CreationNodeMask = 0;
+ g_stDefaultHeapProps.VisibleNodeMask = 0;
+
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
+ g_stUploadHeapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
+ g_stUploadHeapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
+ g_stUploadHeapProps.CreationNodeMask = 0;
+ g_stUploadHeapProps.VisibleNodeMask = 0;
+
+ g_stBufferResSesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ g_stBufferResSesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ g_stBufferResSesc.Flags = D3D12_RESOURCE_FLAG_NONE;
+ g_stBufferResSesc.Format = DXGI_FORMAT_UNKNOWN;
+ g_stBufferResSesc.Width = 0;
+ g_stBufferResSesc.Height = 1;
+ g_stBufferResSesc.DepthOrArraySize = 1;
+ g_stBufferResSesc.MipLevels = 1;
+ g_stBufferResSesc.SampleDesc.Count = 1;
+ g_stBufferResSesc.SampleDesc.Quality = 0;
+ }
+
+ // 0-2、得到当前的工作目录,方便我们使用相对路径来访问各种资源文件
+ {
+ if (0 == ::GetModuleFileName(nullptr, g_pszAppPath, MAX_PATH))
+ {
+ GRS_THROW_IF_FAILED(HRESULT_FROM_WIN32(GetLastError()));
+ }
+
+ WCHAR* lastSlash = _tcsrchr(g_pszAppPath, _T('\\'));
+ if (lastSlash)
+ {//删除Exe文件名
+ *(lastSlash) = _T('\0');
+ }
+
+ lastSlash = _tcsrchr(g_pszAppPath, _T('\\'));
+ if (lastSlash)
+ {//删除x64路径
+ *(lastSlash) = _T('\0');
+ }
+
+ lastSlash = _tcsrchr(g_pszAppPath, _T('\\'));
+ if (lastSlash)
+ {//删除Debug 或 Release路径
+ *(lastSlash + 1) = _T('\0');
+ }
+
+ ::StringCchPrintf(g_pszShaderPath
+ , MAX_PATH
+ , _T("%s27-IBL-With-Material-Texture\\Shader")
+ , g_pszAppPath);
+ }
+
+ // 0-3、准备编程Shader时处理包含文件的类及路径
+ TCHAR pszPublicShaderPath[MAX_PATH] = {};
+ ::StringCchPrintf(pszPublicShaderPath
+ , MAX_PATH
+ , _T("%sShader")
+ , g_pszAppPath);
+ CGRSD3DCompilerInclude grsD3DCompilerInclude(pszPublicShaderPath);
+ grsD3DCompilerInclude.AddDir(g_pszShaderPath);
+
+ // 0-4、初始化摄像机参数
+ {
+ g_stCamera.m_v4EyePos = XMVectorSet(0.0f, 1.0f, -10.0f, 1.0f); // 位置
+ g_stCamera.m_v4LookDir = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); // 朝向
+ g_stCamera.m_v4UpDir = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); // 上方
+ g_stCamera.m_fNear = 0.1f;
+ g_stCamera.m_fFar = 200000.0f; //这个超大的值是为了 skybox
+
+ // 设置虚拟控制球半径
+ g_stCameraControl.m_fRadius = 100.0f;
+ // 初始化鼠标旋转控制四元数
+ g_stCameraControl.m_qCameraStart = XMQuaternionIdentity();
+ g_stCameraControl.m_qCameraMoves = g_stCameraControl.m_qCameraStart;
+ }
+
+ // 1-1、创建窗口
+ {
+ WNDCLASSEX wcex = {};
+ wcex.cbSize = sizeof(WNDCLASSEX);
+ wcex.style = CS_GLOBALCLASS;
+ wcex.lpfnWndProc = WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInstance;
+ wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH); //防止无聊的背景重绘
+ wcex.lpszClassName = GRS_WND_CLASS;
+
+ ::RegisterClassEx(&wcex);
+
+ g_stD3DDevice.m_dwWndStyle = WS_OVERLAPPEDWINDOW;
+
+ RECT rtWnd = { 0, 0, g_stD3DDevice.m_iWndWidth, g_stD3DDevice.m_iWndHeight };
+ ::AdjustWindowRect(&rtWnd, g_stD3DDevice.m_dwWndStyle, FALSE);
+
+ // 计算窗口居中的屏幕坐标
+ INT posX = (::GetSystemMetrics(SM_CXSCREEN) - rtWnd.right - rtWnd.left) / 2;
+ INT posY = (::GetSystemMetrics(SM_CYSCREEN) - rtWnd.bottom - rtWnd.top) / 2;
+
+ g_stD3DDevice.m_hWnd = ::CreateWindowW(GRS_WND_CLASS
+ , GRS_WND_TITLE
+ , g_stD3DDevice.m_dwWndStyle
+ , posX
+ , posY
+ , rtWnd.right - rtWnd.left
+ , rtWnd.bottom - rtWnd.top
+ , nullptr
+ , nullptr
+ , hInstance
+ , nullptr);
+
+ if (!g_stD3DDevice.m_hWnd)
+ {
+ GRS_THROW_IF_FAILED(HRESULT_FROM_WIN32(GetLastError()));
+ }
+ }
+
+ // 2-1、创建DXGI Factory对象
+ {
+ UINT nDXGIFactoryFlags = 0U;
+#if defined(_DEBUG)
+ // 打开显示子系统的调试支持
+ ComPtr debugController;
+ if (SUCCEEDED(::D3D12GetDebugInterface(IID_PPV_ARGS(&debugController))))
+ {
+ debugController->EnableDebugLayer();
+ // 打开附加的调试支持
+ nDXGIFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
+ }
+#endif
+ ComPtr pIDXGIFactory5;
+ GRS_THROW_IF_FAILED(::CreateDXGIFactory2(nDXGIFactoryFlags, IID_PPV_ARGS(&pIDXGIFactory5)));
+ GRS_SET_DXGI_DEBUGNAME_COMPTR(pIDXGIFactory5);
+
+ //获取IDXGIFactory6接口
+ GRS_THROW_IF_FAILED(pIDXGIFactory5.As(&g_stD3DDevice.m_pIDXGIFactory6));
+ GRS_SET_DXGI_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIDXGIFactory6);
+
+ // 检测Tearing支持
+ HRESULT hr = g_stD3DDevice.m_pIDXGIFactory6->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING
+ , &g_stD3DDevice.m_bSupportTearing
+ , sizeof(g_stD3DDevice.m_bSupportTearing));
+ g_stD3DDevice.m_bSupportTearing = SUCCEEDED(hr) && g_stD3DDevice.m_bSupportTearing;
+ }
+
+ // 2-2、枚举适配器创建设备
+ { //选择高性能的显卡来创建3D设备对象
+ ComPtr pIAdapter1;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIDXGIFactory6->EnumAdapterByGpuPreference(0
+ , DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE
+ , IID_PPV_ARGS(&pIAdapter1)));
+ GRS_SET_DXGI_DEBUGNAME_COMPTR(pIAdapter1);
+
+ // 创建D3D12.1的设备
+ GRS_THROW_IF_FAILED(D3D12CreateDevice(pIAdapter1.Get(), D3D_FEATURE_LEVEL_12_1, IID_PPV_ARGS(&g_stD3DDevice.m_pID3D12Device4)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pID3D12Device4);
+
+
+ DXGI_ADAPTER_DESC1 stAdapterDesc = {};
+ TCHAR pszWndTitle[MAX_PATH] = {};
+ GRS_THROW_IF_FAILED(pIAdapter1->GetDesc1(&stAdapterDesc));
+ ::GetWindowText(g_stD3DDevice.m_hWnd, pszWndTitle, MAX_PATH);
+ StringCchPrintf(pszWndTitle
+ , MAX_PATH
+ , _T("%s(GPU[0]:%s)")
+ , pszWndTitle
+ , stAdapterDesc.Description);
+ ::SetWindowText(g_stD3DDevice.m_hWnd, pszWndTitle);
+ }
+
+ // 2-3、得到每种描述符元素的大小
+ {
+ g_stD3DDevice.m_nRTVDescriptorSize
+ = g_stD3DDevice.m_pID3D12Device4->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
+ g_stD3DDevice.m_nDSVDescriptorSize
+ = g_stD3DDevice.m_pID3D12Device4->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV);
+ g_stD3DDevice.m_nSamplerDescriptorSize
+ = g_stD3DDevice.m_pID3D12Device4->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);
+ g_stD3DDevice.m_nCBVSRVDescriptorSize
+ = g_stD3DDevice.m_pID3D12Device4->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+ }
+
+ // 2-4、创建命令队列&命令列表
+ {
+ D3D12_COMMAND_QUEUE_DESC stQueueDesc = {};
+ stQueueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandQueue(&stQueueDesc, IID_PPV_ARGS(&g_stD3DDevice.m_pIMainCMDQueue)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIMainCMDQueue);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandAllocator(
+ D3D12_COMMAND_LIST_TYPE_DIRECT
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIMainCMDAlloc)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIMainCMDAlloc);
+
+ // 创建图形命令列表
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandList(
+ 0
+ , D3D12_COMMAND_LIST_TYPE_DIRECT
+ , g_stD3DDevice.m_pIMainCMDAlloc.Get()
+ , nullptr
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIMainCMDList)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIMainCMDList);
+ }
+
+ // 2-5、创建交换链
+ {
+ DXGI_SWAP_CHAIN_DESC1 stSwapChainDesc = {};
+ stSwapChainDesc.BufferCount = g_nFrameBackBufCount;
+ stSwapChainDesc.Width = g_stD3DDevice.m_iWndWidth;
+ stSwapChainDesc.Height = g_stD3DDevice.m_iWndHeight;
+ stSwapChainDesc.Format = g_stD3DDevice.m_emRenderTargetFormat;
+ stSwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ stSwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
+ stSwapChainDesc.SampleDesc.Count = 1;
+ stSwapChainDesc.Scaling = DXGI_SCALING_NONE;
+
+ // 检测并启用Tearing支持
+ stSwapChainDesc.Flags = g_stD3DDevice.m_bSupportTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
+
+ ComPtr pISwapChain1;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIDXGIFactory6->CreateSwapChainForHwnd(
+ g_stD3DDevice.m_pIMainCMDQueue.Get(), // 交换链需要命令队列,Present命令要执行
+ g_stD3DDevice.m_hWnd,
+ &stSwapChainDesc,
+ nullptr,
+ nullptr,
+ &pISwapChain1
+ ));
+ GRS_SET_DXGI_DEBUGNAME_COMPTR(pISwapChain1);
+
+ GRS_THROW_IF_FAILED(pISwapChain1.As(&g_stD3DDevice.m_pISwapChain3));
+ GRS_SET_DXGI_DEBUGNAME_COMPTR(g_stD3DDevice.m_pISwapChain3);
+
+ //得到当前后缓冲区的序号,也就是下一个将要呈送显示的缓冲区的序号
+ //注意此处使用了高版本的SwapChain接口的函数
+ g_stD3DDevice.m_nFrameIndex = g_stD3DDevice.m_pISwapChain3->GetCurrentBackBufferIndex();
+
+ //创建RTV(渲染目标视图)描述符堆(这里堆的含义应当理解为数组或者固定大小元素的固定大小显存池)
+ {
+ D3D12_DESCRIPTOR_HEAP_DESC stRTVHeapDesc = {};
+ stRTVHeapDesc.NumDescriptors = g_nFrameBackBufCount;
+ stRTVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+ stRTVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(
+ &stRTVHeapDesc
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIRTVHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIRTVHeap);
+
+ }
+
+ //创建RTV的描述符
+ {
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stD3DDevice.m_pIRTVHeap->GetCPUDescriptorHandleForHeapStart();
+ for (UINT i = 0; i < g_nFrameBackBufCount; i++)
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pISwapChain3->GetBuffer(i
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIARenderTargets[i])));
+
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stD3DDevice.m_pIARenderTargets, i);
+
+ g_stD3DDevice.m_pID3D12Device4->CreateRenderTargetView(g_stD3DDevice.m_pIARenderTargets[i].Get()
+ , nullptr
+ , stRTVHandle);
+
+ stRTVHandle.ptr += g_stD3DDevice.m_nRTVDescriptorSize;
+ }
+ }
+
+ if (g_stD3DDevice.m_bSupportTearing)
+ {// 如果支持Tearing,那么就关闭系统的ALT + Entery全屏键支持,而改用我们自己处理
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIDXGIFactory6->MakeWindowAssociation(g_stD3DDevice.m_hWnd, DXGI_MWA_NO_ALT_ENTER));
+ }
+
+ }
+
+ // 2-6、创建深度缓冲及深度缓冲描述符堆
+ {
+ D3D12_DEPTH_STENCIL_VIEW_DESC stDepthStencilDesc = {};
+ D3D12_CLEAR_VALUE stDepthOptimizedClearValue = {};
+ D3D12_RESOURCE_DESC stDSTex2DDesc = {};
+ D3D12_DESCRIPTOR_HEAP_DESC stDSVHeapDesc = {};
+
+ stDepthStencilDesc.Format = g_stD3DDevice.m_emDepthStencilFormat;
+ stDepthStencilDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
+ stDepthStencilDesc.Flags = D3D12_DSV_FLAG_NONE;
+
+ stDepthOptimizedClearValue.Format = g_stD3DDevice.m_emDepthStencilFormat;
+ stDepthOptimizedClearValue.DepthStencil.Depth = 1.0f;
+ stDepthOptimizedClearValue.DepthStencil.Stencil = 0;
+
+ stDSTex2DDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stDSTex2DDesc.Alignment = 0;
+ stDSTex2DDesc.Width = g_stD3DDevice.m_iWndWidth;
+ stDSTex2DDesc.Height = g_stD3DDevice.m_iWndHeight;
+ stDSTex2DDesc.DepthOrArraySize = 1;
+ stDSTex2DDesc.MipLevels = 0;
+ stDSTex2DDesc.Format = g_stD3DDevice.m_emDepthStencilFormat;
+ stDSTex2DDesc.SampleDesc.Count = 1;
+ stDSTex2DDesc.SampleDesc.Quality = 0;
+ stDSTex2DDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ stDSTex2DDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
+
+ stDSVHeapDesc.NumDescriptors = 1;
+ stDSVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
+ stDSVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ //使用隐式默认堆创建一个深度蜡板缓冲区,
+ //因为基本上深度缓冲区会一直被使用,重用的意义不大,所以直接使用隐式堆,图方便
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &stDSTex2DDesc
+ , D3D12_RESOURCE_STATE_DEPTH_WRITE
+ , &stDepthOptimizedClearValue
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIDepthStencilBuffer)
+ ));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIDepthStencilBuffer);
+ //==============================================================================================
+
+ // 创建 DSV Heap
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stDSVHeapDesc, IID_PPV_ARGS(&g_stD3DDevice.m_pIDSVHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIDSVHeap);
+ // 创建 DSV
+ g_stD3DDevice.m_pID3D12Device4->CreateDepthStencilView(g_stD3DDevice.m_pIDepthStencilBuffer.Get()
+ , &stDepthStencilDesc
+ , g_stD3DDevice.m_pIDSVHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+
+ // 2-7、创建围栏
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateFence(0
+ , D3D12_FENCE_FLAG_NONE
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIFence)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stD3DDevice.m_pIFence);
+
+ // 初始化 Fence 计数为 1
+ g_stD3DDevice.m_n64FenceValue = 1;
+
+ // 创建一个Event同步对象,用于等待围栏事件通知
+ // 本质上是为了 CPU 与 GPU 的同步
+ g_stD3DDevice.m_hEventFence = CreateEvent(nullptr, FALSE, FALSE, nullptr);
+ if (g_stD3DDevice.m_hEventFence == nullptr)
+ {
+ GRS_THROW_IF_FAILED(HRESULT_FROM_WIN32(GetLastError()));
+ }
+ }
+
+ // 2-8、检测根签名版本,现在只支持1.1以上的,低版本的就丢弃退出了,不然兼容的代码太啰嗦了也毫无营养
+ {
+ D3D12_FEATURE_DATA_ROOT_SIGNATURE stFeatureData = {};
+ // 检测是否支持V1.1版本的根签名
+ stFeatureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ if (FAILED(g_stD3DDevice.m_pID3D12Device4->CheckFeatureSupport(D3D12_FEATURE_ROOT_SIGNATURE
+ , &stFeatureData
+ , sizeof(stFeatureData))))
+ { // 1.0版 直接丢异常退出了
+ ATLTRACE("系统不支持V1.1的跟签名,直接退出了,需要运行自行修改创建跟签名的代码回1.0版。");
+ GRS_THROW_IF_FAILED(E_NOTIMPL);
+ }
+ }
+
+ //---------------------------------------------------------------------------------------
+ // 3、使用HDR 等距柱面环境贴图生成 立方体贴图的六个面
+ // 第一种方式: 使用GS Render Target Array方法一次渲染到六个面
+ {}
+ // 3-1-0、初始化Render Target参数
+ {
+ g_st1TimesGSRTAStatus.m_nRTWidth = GRS_RTA_DEFAULT_SIZE_W;
+ g_st1TimesGSRTAStatus.m_nRTHeight = GRS_RTA_DEFAULT_SIZE_H;
+ g_st1TimesGSRTAStatus.m_stViewPort = { 0.0f
+ , 0.0f
+ , static_cast(g_st1TimesGSRTAStatus.m_nRTWidth)
+ , static_cast(g_st1TimesGSRTAStatus.m_nRTHeight)
+ , D3D12_MIN_DEPTH, D3D12_MAX_DEPTH };
+ g_st1TimesGSRTAStatus.m_stScissorRect = { 0
+ , 0
+ , static_cast(g_st1TimesGSRTAStatus.m_nRTWidth)
+ , static_cast(g_st1TimesGSRTAStatus.m_nRTHeight) };
+ g_st1TimesGSRTAStatus.m_emRTAFormat = DXGI_FORMAT_R32G32B32A32_FLOAT;
+ }
+
+ // 3-1-1、创建利用 Geometry shader 渲染到Cube Map的PSO
+ {
+ g_st1TimesGSPSO.m_nCBVCnt = 2;
+ g_st1TimesGSPSO.m_nSRVCnt = 1;
+ g_st1TimesGSPSO.m_nSmpCnt = 1;
+ g_st1TimesGSPSO.m_nCnt = g_st1TimesGSPSO.m_nCBVCnt + g_st1TimesGSPSO.m_nSRVCnt;
+
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[3] = {};
+ // 2 Const Buffer ( MVP Matrix + Cube Map 6 View Matrix)
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = g_st1TimesGSPSO.m_nCBVCnt;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Texture ( HDR Texture )
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = g_st1TimesGSPSO.m_nSRVCnt;
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0;
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Sampler ( Linear Sampler )
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[2].NumDescriptors = g_st1TimesGSPSO.m_nSmpCnt;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 0;
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[3] = {};
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//CBV是所有Shader可见
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SRV仅PS可见
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SAMPLE仅PS可见
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_st1TimesGSPSO.m_pIRS)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSPSO.m_pIRS);
+
+ //--------------------------------------------------------------------------------------------------------------------------------
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+
+ ComPtr pIVSCode;
+ ComPtr pIGSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\1-2 GRS_1Times_GS_HDR_2_CubeMap_VS_GS.hlsl"), g_pszShaderPath);
+
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_0", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ hr = ::D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "GSMain", "gs_5_0", nCompileFlags, 0, &pIGSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Geometry Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\1-3 GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl")
+ , g_pszShaderPath);
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_0", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+
+ stPSODesc.pRootSignature = g_st1TimesGSPSO.m_pIRS.Get();
+
+ // VS -> GS -> PS
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.GS.BytecodeLength = pIGSCode->GetBufferSize();
+ stPSODesc.GS.pShaderBytecode = pIGSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ // 注意关闭背面剔除,因为定义的Triangle Strip Box的顶点有反向的
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_st1TimesGSRTAStatus.m_emRTAFormat;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc, IID_PPV_ARGS(&g_st1TimesGSPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSPSO.m_pIPSO);
+
+ // 创建 CBV SRV Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSRVHeapDesc = {};
+ stSRVHeapDesc.NumDescriptors = 6; // 5 CBV + 1 SRV
+ stSRVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+ stSRVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSRVHeapDesc
+ , IID_PPV_ARGS(&g_st1TimesGSHeap.m_pICBVSRVHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSHeap.m_pICBVSRVHeap);
+
+ g_st1TimesGSHeap.m_nSRVOffset = 5; //第6个是SRV
+
+ // 创建 Sample Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSamplerHeapDesc = {};
+ stSamplerHeapDesc.NumDescriptors = g_st1TimesGSPSO.m_nSmpCnt; // 1 Sample
+ stSamplerHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
+ stSamplerHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSamplerHeapDesc
+ , IID_PPV_ARGS(&g_st1TimesGSHeap.m_pISAPHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSHeap.m_pISAPHeap);
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-1-2、打开一个HDR文件 并创建成纹理
+ {
+ // 先设置默认的 HDR File Path
+ StringCchPrintf(g_pszHDRFilePath
+ , MAX_PATH
+ , _T("%sAssets\\HDR Light\\Tropical_Beach")
+ , g_pszAppPath);
+
+ StringCchPrintf(g_stHDRData.m_pszHDRFile
+ , MAX_PATH
+ , _T("%s\\Tropical_Beach_3k.hdr")
+ , g_pszHDRFilePath);
+
+#ifdef GRS_USE_DIR_DIALOG
+ OPENFILENAME stOfn = {};
+
+ RtlZeroMemory(&stOfn, sizeof(stOfn));
+ stOfn.lStructSize = sizeof(stOfn);
+ stOfn.hwndOwner = ::GetDesktopWindow(); //g_stD3DDevice.m_hWnd;
+ stOfn.lpstrFilter = _T("HDR 文件 \0*.hdr\0所有文件\0*.*\0");
+ stOfn.lpstrFile = g_stHDRData.m_pszHDRFile;
+ stOfn.nMaxFile = MAX_PATH;
+ stOfn.lpstrTitle = _T("请选择一个 HDR 文件...");
+ stOfn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
+
+ if (!::GetOpenFileName(&stOfn))
+ {
+ StringCchPrintf(g_stHDRData.m_pszHDRFile
+ , MAX_PATH
+ , _T("%sAssets\\PBR HDR Lights\\Stadium_Center\\Stadium_Center_3k.hdr")
+ , g_pszAppPath);
+ }
+ else
+ {// 暂存一下路径 方便后面选择天空盒大图
+ StringCchCopy(g_pszHDRFilePath, MAX_PATH, g_stHDRData.m_pszHDRFile);
+
+ WCHAR* lastSlash = _tcsrchr(g_pszHDRFilePath, _T('\\'));
+
+ if (lastSlash)
+ {//删除Exe文件名
+ *(lastSlash) = _T('\0');
+ }
+ }
+#endif
+
+ // 下面这句意思是要不要上下颠倒一下图片
+ // 注意在OpenGL中纹理坐标纵方向是从下倒上所以需要颠倒一下
+ // 咱们是D3D 就不管了 所见即所得!
+ //stbi_set_flip_vertically_on_load(true);
+
+ g_stHDRData.m_pfHDRData = stbi_loadf(T2A(g_stHDRData.m_pszHDRFile)
+ , &g_stHDRData.m_iHDRWidth
+ , &g_stHDRData.m_iHDRHeight
+ , &g_stHDRData.m_iHDRPXComponents
+ , 0);
+ if (nullptr == g_stHDRData.m_pfHDRData)
+ {
+ ATLTRACE(_T("无法加载HDR文件:\"%s\"\n"), g_stHDRData.m_pszHDRFile);
+ AtlThrowLastWin32();
+ }
+
+ if (3 == g_stHDRData.m_iHDRPXComponents)
+ {
+ g_stHDRData.m_emHDRFormat = DXGI_FORMAT_R32G32B32_FLOAT;
+ }
+ else
+ {
+ ATLTRACE(_T("HDR文件:\"%s\",不是3部分Float格式,无法使用!\n"), g_stHDRData.m_pszHDRFile);
+ AtlThrowLastWin32();
+ }
+
+ UINT nRowAlign = 8u;
+ UINT nBPP = (UINT)g_stHDRData.m_iHDRPXComponents * sizeof(float);
+
+ //UINT nPicRowPitch = ( iHDRWidth * nBPP + 7u ) / 8u;
+ UINT nPicRowPitch = GRS_UPPER(g_stHDRData.m_iHDRWidth * nBPP, nRowAlign);
+
+ ID3D12Resource* pITextureUpload = nullptr;
+ ID3D12Resource* pITexture = nullptr;
+ BOOL bRet = LoadTextureFromMem(g_stD3DDevice.m_pIMainCMDList.Get()
+ , (BYTE*)g_stHDRData.m_pfHDRData
+ , (size_t)g_stHDRData.m_iHDRWidth * nBPP * g_stHDRData.m_iHDRHeight
+ , g_stHDRData.m_emHDRFormat
+ , g_stHDRData.m_iHDRWidth
+ , g_stHDRData.m_iHDRHeight
+ , nPicRowPitch
+ , pITextureUpload
+ , pITexture
+ );
+
+ if (!bRet)
+ {
+ AtlThrowLastWin32();
+ }
+
+ g_stHDRData.m_pIHDRTextureRaw.Attach(pITexture);
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stHDRData.m_pIHDRTextureRaw);
+ g_stHDRData.m_pIHDRTextureRawUpload.Attach(pITextureUpload);
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stHDRData.m_pIHDRTextureRawUpload);
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stHeapHandle
+ = g_st1TimesGSHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ stHeapHandle.ptr
+ += (g_st1TimesGSHeap.m_nSRVOffset * g_stD3DDevice.m_nCBVSRVDescriptorSize); // 按照管线的要求偏移到正确的 SRV 插槽
+
+ // 创建 HDR Texture SRV
+ D3D12_SHADER_RESOURCE_VIEW_DESC stSRVDesc = {};
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = g_stHDRData.m_emHDRFormat;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ stSRVDesc.Texture2D.MipLevels = 1;
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_stHDRData.m_pIHDRTextureRaw.Get(), &stSRVDesc, stHeapHandle);
+
+ // 创建一个线性过滤的边缘裁切的采样器
+ D3D12_SAMPLER_DESC stSamplerDesc = {};
+ stSamplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
+
+ stSamplerDesc.MinLOD = 0;
+ stSamplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
+ stSamplerDesc.MipLODBias = 0.0f;
+ stSamplerDesc.MaxAnisotropy = 1;
+ stSamplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+ stSamplerDesc.BorderColor[0] = 0.0f;
+ stSamplerDesc.BorderColor[1] = 0.0f;
+ stSamplerDesc.BorderColor[2] = 0.0f;
+ stSamplerDesc.BorderColor[3] = 0.0f;
+ stSamplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateSampler(&stSamplerDesc
+ , g_st1TimesGSHeap.m_pISAPHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-1-3、创建GS Render Target Array 的Texture2DArray纹理及RTV
+ {
+ //创建RTV(渲染目标视图)描述符堆( 这里是离屏表面的描述符堆 )
+ {
+ D3D12_DESCRIPTOR_HEAP_DESC stRTVHeapDesc = {};
+ stRTVHeapDesc.NumDescriptors = 1; // 1 Render Target Array RTV
+ stRTVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+ stRTVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stRTVHeapDesc, IID_PPV_ARGS(&g_st1TimesGSRTAStatus.m_pIRTAHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSRTAStatus.m_pIRTAHeap);
+ }
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle = g_st1TimesGSRTAStatus.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ // 注意这里创建的离屏渲染目标资源,必须是Texture2DArray类型,并且有6个SubResource
+ // 这是适合 Geometry Shader 一次渲染多个 Render Target Array 的方式。
+ // 在 Geometry Shader 中使用系统变量 SV_RenderTargetArrayIndex 标识 Render Target的索引。
+ // 多个独立 Texture Render Target 的方案适用于真正 MRT 的 GBuffer 中,
+ // 一般在 Pixel Shader 中使用 SV_Target(n) 来标识具体的 Render Target,其中 n 为索引
+ // 如:SV_Target0、SV_Target1、SV_Target2 等
+
+ // 创建离屏渲染目标(Render Target Array Texture2DArray)
+ {
+ D3D12_RESOURCE_DESC stRenderTargetDesc = g_stD3DDevice.m_pIARenderTargets[0]->GetDesc();
+ stRenderTargetDesc.Format = g_st1TimesGSRTAStatus.m_emRTAFormat;
+ stRenderTargetDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stRenderTargetDesc.Width = g_st1TimesGSRTAStatus.m_nRTWidth;
+ stRenderTargetDesc.Height = g_st1TimesGSRTAStatus.m_nRTHeight;
+ stRenderTargetDesc.DepthOrArraySize = GRS_CUBE_MAP_FACE_CNT;
+
+ D3D12_CLEAR_VALUE stClearValue = {};
+ stClearValue.Format = g_st1TimesGSRTAStatus.m_emRTAFormat;
+ stClearValue.Color[0] = g_stD3DDevice.m_faClearColor[0];
+ stClearValue.Color[1] = g_stD3DDevice.m_faClearColor[1];
+ stClearValue.Color[2] = g_stD3DDevice.m_faClearColor[2];
+ stClearValue.Color[3] = g_stD3DDevice.m_faClearColor[3];
+
+ // 创建离屏表面资源
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stRenderTargetDesc,
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
+ &stClearValue,
+ IID_PPV_ARGS(&g_st1TimesGSRTAStatus.m_pITextureRTA)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSRTAStatus.m_pITextureRTA);
+
+ // 创建对应的RTV的描述符
+ // 这里的D3D12_RENDER_TARGET_VIEW_DESC结构很重要,
+ // 这是使用Texture2DArray作为Render Target Array时必须要明确填充的结构体,
+ // 否则 Geometry Shader 没法识别这个Array
+ // 一般创建 Render Target 时不填充这个结构,
+ // 直接在 CreateRenderTargetView 的第二个参数传入nullptr
+
+ D3D12_RENDER_TARGET_VIEW_DESC stRTADesc = {};
+ stRTADesc.Format = g_st1TimesGSRTAStatus.m_emRTAFormat;
+ stRTADesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
+ stRTADesc.Texture2DArray.ArraySize = GRS_CUBE_MAP_FACE_CNT;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateRenderTargetView(g_st1TimesGSRTAStatus.m_pITextureRTA.Get(), &stRTADesc, stRTVHandle);
+
+ D3D12_RESOURCE_DESC stDownloadResDesc = {};
+ stDownloadResDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ stDownloadResDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
+ stDownloadResDesc.Width = 0;
+ stDownloadResDesc.Height = 1;
+ stDownloadResDesc.DepthOrArraySize = 1;
+ stDownloadResDesc.MipLevels = 1;
+ stDownloadResDesc.Format = DXGI_FORMAT_UNKNOWN;
+ stDownloadResDesc.SampleDesc.Count = 1;
+ stDownloadResDesc.SampleDesc.Quality = 0;
+ stDownloadResDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ stDownloadResDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
+
+ UINT64 n64ResBufferSize = 0;
+
+ g_stD3DDevice.m_pID3D12Device4->GetCopyableFootprints(&stRenderTargetDesc
+ , 0, GRS_CUBE_MAP_FACE_CNT, 0, nullptr, nullptr, nullptr, &n64ResBufferSize);
+
+ stDownloadResDesc.Width = n64ResBufferSize;
+
+ // 后面的纹理需要将渲染的结果复制出来,必要的话需要存储至指定的文件,所以先变成Read Back堆
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_READBACK;
+ // Download Heap == Upload Heap 都是共享内存!
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stDownloadResDesc,
+ D3D12_RESOURCE_STATE_COPY_DEST,
+ nullptr,
+ IID_PPV_ARGS(&g_st1TimesGSRTAStatus.m_pITextureRTADownload)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st1TimesGSRTAStatus.m_pITextureRTADownload);
+
+ // 还原为上传堆属性,后续还需要用
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
+ }
+ }
+
+ // 3-1-4、准备立方体
+ {
+ // 定义正方形的3D数据结构
+ ST_GRS_VERTEX_CUBE_BOX pstVertices[] = {
+ { { -1.0f, 1.0f, -1.0f, 1.0f} },
+ { { -1.0f, -1.0f, -1.0f, 1.0f} },
+
+ { { 1.0f, 1.0f, -1.0f, 1.0f} },
+ { { 1.0f, -1.0f, -1.0f, 1.0f} },
+
+ { { 1.0f, 1.0f, 1.0f, 1.0f} },
+ { { 1.0f, -1.0f, 1.0f, 1.0f} },
+
+ { { -1.0f, 1.0f, 1.0f, 1.0f} },
+ { { -1.0f, -1.0f, 1.0f, 1.0f} },
+
+ { { -1.0f, 1.0f, -1.0f, 1.0f} },
+ { { -1.0f, -1.0f, -1.0f, 1.0f} },
+
+ { { -1.0f, -1.0f, 1.0f, 1.0f} },
+ { { 1.0f, -1.0f, -1.0f, 1.0f} },
+
+ { { 1.0f, -1.0f, 1.0f, 1.0f} },
+ { { 1.0f, 1.0f, 1.0f, 1.0f} },
+
+ { { -1.0f, 1.0f, 1.0f, 1.0f} },
+ { { 1.0f, 1.0f, -1.0f, 1.0f} },
+
+ { { -1.0f, 1.0f, -1.0f, 1.0f} },
+ };
+
+ g_stBoxData_Strip.m_nVertexCount = _countof(pstVertices);
+
+ const UINT64 nVertexBufferSize = sizeof(pstVertices);
+
+ g_stBufferResSesc.Width = GRS_UPPER(nVertexBufferSize, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ // 创建顶点缓冲 (共享内存中)
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stBoxData_Strip.m_pIVertexBuffer)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stBoxData_Strip.m_pIVertexBuffer);
+
+ UINT8* pBufferData = nullptr;
+ // map 大法 Copy 顶点数据到顶点缓冲中
+ GRS_THROW_IF_FAILED(g_stBoxData_Strip.m_pIVertexBuffer->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, pstVertices, nVertexBufferSize);
+ g_stBoxData_Strip.m_pIVertexBuffer->Unmap(0, nullptr);
+
+ // 创建顶点缓冲视图
+ g_stBoxData_Strip.m_stVertexBufferView.BufferLocation = g_stBoxData_Strip.m_pIVertexBuffer->GetGPUVirtualAddress();
+ g_stBoxData_Strip.m_stVertexBufferView.StrideInBytes = sizeof(ST_GRS_VERTEX_CUBE_BOX);
+ g_stBoxData_Strip.m_stVertexBufferView.SizeInBytes = nVertexBufferSize;
+ }
+
+ // 3-1-5、创建常量缓冲区
+ {
+ // 创建Scene Matrix 常量缓冲
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_stWorldConstData.m_pISceneMatrixBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stWorldConstData.m_pISceneMatrixBuffer);
+ // 映射出 Scene 常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_stWorldConstData.m_pISceneMatrixBuffer->Map(0, nullptr, reinterpret_cast(&g_stWorldConstData.m_pstSceneMatrix)));
+
+ // 创建GS Matrix 常量缓冲
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_CB_GS_VIEW_MATRIX), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_stWorldConstData.m_pIGSMatrixBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stWorldConstData.m_pIGSMatrixBuffer);
+
+ // 映射出 GS Matrix 常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_stWorldConstData.m_pIGSMatrixBuffer->Map(0, nullptr, reinterpret_cast(&g_stWorldConstData.m_pstGSViewMatrix)));
+
+ // 创建 PBR Material 常量缓冲
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_PBR_MATERIAL)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_stWorldConstData.m_pIPBRMaterialBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stWorldConstData.m_pIPBRMaterialBuffer);
+
+ // 映射出 PBR Material 常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_stWorldConstData.m_pIPBRMaterialBuffer->Map(0
+ , nullptr
+ , reinterpret_cast(&g_stWorldConstData.m_pstPBRMaterial)));
+
+ // 创建 Scene Camera 常量缓冲
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_SCENE_CAMERA)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_stWorldConstData.m_pISceneCameraBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stWorldConstData.m_pISceneCameraBuffer);
+
+ // 映射出 Scene Camera 常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_stWorldConstData.m_pISceneCameraBuffer->Map(0
+ , nullptr
+ , reinterpret_cast(&g_stWorldConstData.m_pstSceneCamera)));
+
+ // 创建 Scene Lights 常量缓冲
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_SCENE_LIGHTS)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_stWorldConstData.m_pISceneLightsBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stWorldConstData.m_pISceneLightsBuffer);
+
+ // 映射出 Scene Lights 常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_stWorldConstData.m_pISceneLightsBuffer->Map(0
+ , nullptr
+ , reinterpret_cast(&g_stWorldConstData.m_pstSceneLights)));
+
+ // 创建 缓冲的 CBV
+ D3D12_CPU_DESCRIPTOR_HANDLE stCBVHandle
+ = g_st1TimesGSHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+
+ D3D12_CONSTANT_BUFFER_VIEW_DESC stCBVDesc = {};
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ //1、Scene Matrix
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pIGSMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_GS_VIEW_MATRIX)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //2、GS Views
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneCameraBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_SCENE_CAMERA)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //3、Camera
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneLightsBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_SCENE_LIGHTS)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //4、Lights
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pIPBRMaterialBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_PBR_MATERIAL)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //5、PBR Material
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVHandle);
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-1-5、设置常量缓冲矩阵中的数据
+ {
+ // 填充场景矩阵
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ = XMMatrixIdentity();
+ g_stWorldConstData.m_pstSceneMatrix->m_mxView
+ = XMMatrixLookToLH(g_stCamera.m_v4EyePos, g_stCamera.m_v4LookDir, g_stCamera.m_v4UpDir);
+
+ // 注意这里的投影矩阵的视角 和 纵横比,视角是 90度,纵横比是 1.0f 也就是方形的投影
+ g_stWorldConstData.m_pstSceneMatrix->m_mxProj
+ = XMMatrixPerspectiveFovLH(XM_PIDIV2, 1.0f, g_stCamera.m_fNear, g_stCamera.m_fFar);
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorldView
+ = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxView);
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWVP
+ = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxWorldView
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxProj);
+ g_stWorldConstData.m_pstSceneMatrix->m_mxInvWVP
+ = XMMatrixInverse(nullptr, g_stWorldConstData.m_pstSceneMatrix->m_mxWVP);
+ g_stWorldConstData.m_pstSceneMatrix->m_mxVP
+ = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxView
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxProj);
+ g_stWorldConstData.m_pstSceneMatrix->m_mxInvVP
+ = XMMatrixInverse(nullptr
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxVP);
+
+ // 填充 GS Cube Map 需要的 6个 View Matrix
+ float fHeight = 0.0f;
+ XMVECTOR vEyePt = { 0.0f, fHeight, 0.0f , 1.0f };
+ XMVECTOR vLookDir = {};
+ XMVECTOR vUpDir = {};
+
+ vLookDir = XMVectorSet(1.0f, fHeight, 0.0f, 0.0f);
+ vUpDir = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
+ g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[0] = XMMatrixLookAtLH(vEyePt, vLookDir, vUpDir);
+ vLookDir = XMVectorSet(-1.0f, fHeight, 0.0f, 0.0f);
+ vUpDir = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
+ g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[1] = XMMatrixLookAtLH(vEyePt, vLookDir, vUpDir);
+ vLookDir = XMVectorSet(0.0f, fHeight + 1.0f, 0.0f, 0.0f);
+ vUpDir = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f);
+ g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[2] = XMMatrixLookAtLH(vEyePt, vLookDir, vUpDir);
+ vLookDir = XMVectorSet(0.0f, fHeight - 1.0f, 0.0f, 0.0f);
+ vUpDir = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
+ g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[3] = XMMatrixLookAtLH(vEyePt, vLookDir, vUpDir);
+ vLookDir = XMVectorSet(0.0f, fHeight, 1.0f, 0.0f);
+ vUpDir = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
+ g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[4] = XMMatrixLookAtLH(vEyePt, vLookDir, vUpDir);
+ vLookDir = XMVectorSet(0.0f, fHeight, -1.0f, 0.0f);
+ vUpDir = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
+ g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[5] = XMMatrixLookAtLH(vEyePt, vLookDir, vUpDir);
+ }
+
+ CAtlArray arCmdList;
+ // 3-1-6、执行第二个Copy命令并等待所有的纹理都上传到了默认堆中
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ arCmdList.RemoveAll();
+ arCmdList.Add(g_stD3DDevice.m_pIMainCMDList.Get());
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ // 等待纹理资源正式复制完成先
+ const UINT64 fence = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), fence));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(fence, g_stD3DDevice.m_hEventFence));
+ }
+
+ CAtlArray arHeaps;
+ // 3-1-7、执行1 Times GS Cube Map 渲染,这个过程也只需要执行一次就生成了Cube Map 的6个面
+ {
+ // 等待前面的Copy命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+ // 开始执行 GS Cube Map渲染,将HDR等距柱面纹理 一次性渲染至6个RTV
+ //命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ g_stD3DDevice.m_pIMainCMDList->RSSetViewports(1, &g_st1TimesGSRTAStatus.m_stViewPort);
+ g_stD3DDevice.m_pIMainCMDList->RSSetScissorRects(1, &g_st1TimesGSRTAStatus.m_stScissorRect);
+
+ // 设置渲染目标 注意一次就把所有的离屏渲染目标放进去
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle = g_st1TimesGSRTAStatus.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+ g_stD3DDevice.m_pIMainCMDList->OMSetRenderTargets(1, &stRTVHandle, FALSE, nullptr);
+
+ // 继续记录命令,并真正开始渲染
+ g_stD3DDevice.m_pIMainCMDList->ClearRenderTargetView(stRTVHandle, g_stD3DDevice.m_faClearColor, 0, nullptr);
+
+ //-----------------------------------------------------------------------------------------------------
+ // Draw !
+ //-----------------------------------------------------------------------------------------------------
+ // 渲染Cube
+ // 设置渲染管线状态对象
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootSignature(g_st1TimesGSPSO.m_pIRS.Get());
+ g_stD3DDevice.m_pIMainCMDList->SetPipelineState(g_st1TimesGSPSO.m_pIPSO.Get());
+
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_st1TimesGSHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_st1TimesGSHeap.m_pISAPHeap.Get());
+
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUHandle = g_st1TimesGSHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ // 设置CBV
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(0, stGPUHandle);
+ // 设置SRV
+ stGPUHandle.ptr += (g_st1TimesGSHeap.m_nSRVOffset * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(1, stGPUHandle);
+ // 设置Sample
+ stGPUHandle = g_st1TimesGSHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart();
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(2, stGPUHandle);
+
+ // 渲染手法:三角形带
+ g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ // 设置网格信息
+ g_stD3DDevice.m_pIMainCMDList->IASetVertexBuffers(0, 1, &g_stBoxData_Strip.m_stVertexBufferView);
+ // Draw Call
+ g_stD3DDevice.m_pIMainCMDList->DrawInstanced(g_stBoxData_Strip.m_nVertexCount, 1, 0, 0);
+ //-----------------------------------------------------------------------------------------------------
+ // 使用资源屏障切换下状态,实际是与后面要使用这几个渲染目标的过程进行同步
+ g_st1TimesGSRTAStatus.m_stRTABarriers.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ g_st1TimesGSRTAStatus.m_stRTABarriers.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ g_st1TimesGSRTAStatus.m_stRTABarriers.Transition.pResource = g_st1TimesGSRTAStatus.m_pITextureRTA.Get();
+ g_st1TimesGSRTAStatus.m_stRTABarriers.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ //g_st1TimesGSRTAStatus.m_stRTABarriers.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE;
+ g_st1TimesGSRTAStatus.m_stRTABarriers.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+ g_st1TimesGSRTAStatus.m_stRTABarriers.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+ //资源屏障,用于确定渲染已经结束可以提交画面去显示了
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &g_st1TimesGSRTAStatus.m_stRTABarriers);
+
+ //关闭命令列表,可以去执行了
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+ }
+ //---------------------------------------------------------------------------------------
+
+ //---------------------------------------------------------------------------------------
+ // 第二种方式:执行六遍渲染得到Cube map
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-2-0、初始化Render Target参数
+ {
+ g_st6TimesRTAStatus.m_nRTWidth = GRS_RTA_DEFAULT_SIZE_W;
+ g_st6TimesRTAStatus.m_nRTHeight = GRS_RTA_DEFAULT_SIZE_H;
+ g_st6TimesRTAStatus.m_stViewPort = { 0.0f, 0.0f, static_cast(g_st6TimesRTAStatus.m_nRTWidth), static_cast(g_st6TimesRTAStatus.m_nRTHeight), D3D12_MIN_DEPTH, D3D12_MAX_DEPTH };
+ g_st6TimesRTAStatus.m_stScissorRect = { 0, 0, static_cast(g_st6TimesRTAStatus.m_nRTWidth), static_cast(g_st6TimesRTAStatus.m_nRTHeight) };
+ g_st6TimesRTAStatus.m_emRTAFormat = DXGI_FORMAT_R32G32B32A32_FLOAT;
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-2-1、创建利用将HDR渲染到Cube Map的普通PSO 需要执行6次
+ {
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[3] = {};
+ // 1 Const Buffer ( MVP Matrix )
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = 1;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Texture ( HDR Texture )
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = 1;
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0;
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Sampler ( Linear Sampler )
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[2].NumDescriptors = 1;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 0;
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[3] = {};
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//CBV是所有Shader可见
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SRV仅PS可见
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SAMPLE仅PS可见
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stHDR2CubemapPSO.m_pIRS)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stHDR2CubemapPSO.m_pIRS);
+
+ //--------------------------------------------------------------------------------------------------------------------------------
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+
+ ComPtr pIVSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\1-1 GRS_6Times_HDR_2_Cubemap_VS.hlsl")
+ , g_pszShaderPath);
+
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_0", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\1-3 GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl")
+ , g_pszShaderPath);
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_0", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+ stPSODesc.pRootSignature = g_stHDR2CubemapPSO.m_pIRS.Get();
+
+ // VS -> PS
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_st6TimesRTAStatus.m_emRTAFormat;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc, IID_PPV_ARGS(&g_stHDR2CubemapPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stHDR2CubemapPSO.m_pIPSO);
+
+ // 创建 CBV SRV Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSRVHeapDesc = {};
+ stSRVHeapDesc.NumDescriptors = 2; // 1 CBV + 1 SRV
+ stSRVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+ stSRVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSRVHeapDesc
+ , IID_PPV_ARGS(&g_stHDR2CubemapHeap.m_pICBVSRVHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stHDR2CubemapHeap.m_pICBVSRVHeap);
+
+ // 创建 Sample Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSamplerHeapDesc = {};
+ stSamplerHeapDesc.NumDescriptors = 1; // 1 Sample
+ stSamplerHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
+ stSamplerHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSamplerHeapDesc
+ , IID_PPV_ARGS(&g_stHDR2CubemapHeap.m_pISAPHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stHDR2CubemapHeap.m_pISAPHeap);
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-2-2、创建 SRV 和 Sample
+ {
+ D3D12_CPU_DESCRIPTOR_HANDLE stHeapHandle
+ = g_stHDR2CubemapHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ stHeapHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize; // 按照管线的要求 第2个才是SRV
+
+ // 创建 HDR Texture SRV
+ D3D12_SHADER_RESOURCE_VIEW_DESC stSRVDesc = {};
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = g_stHDRData.m_emHDRFormat;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ stSRVDesc.Texture2D.MipLevels = 1;
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_stHDRData.m_pIHDRTextureRaw.Get(), &stSRVDesc, stHeapHandle);
+
+ // 创建一个线性过滤的边缘裁切的采样器
+ D3D12_SAMPLER_DESC stSamplerDesc = {};
+ stSamplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
+ stSamplerDesc.MinLOD = 0;
+ stSamplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
+ stSamplerDesc.MipLODBias = 0.0f;
+ stSamplerDesc.MaxAnisotropy = 1;
+ stSamplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+ stSamplerDesc.BorderColor[0] = 0.0f;
+ stSamplerDesc.BorderColor[1] = 0.0f;
+ stSamplerDesc.BorderColor[2] = 0.0f;
+ stSamplerDesc.BorderColor[3] = 0.0f;
+ stSamplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateSampler(&stSamplerDesc, g_stHDR2CubemapHeap.m_pISAPHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 3-2-3、创建Render Target Array 的Texture2DArray纹理及RTV
+ {
+ // 创建离屏渲染目标(Render Target Array Texture2DArray)
+ D3D12_RESOURCE_DESC stRenderTargetDesc = g_stD3DDevice.m_pIARenderTargets[0]->GetDesc();
+ stRenderTargetDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stRenderTargetDesc.Format = g_st6TimesRTAStatus.m_emRTAFormat;
+ stRenderTargetDesc.Width = g_st6TimesRTAStatus.m_nRTWidth;
+ stRenderTargetDesc.Height = g_st6TimesRTAStatus.m_nRTHeight;
+ stRenderTargetDesc.DepthOrArraySize = GRS_CUBE_MAP_FACE_CNT;
+
+ D3D12_CLEAR_VALUE stClearValue = {};
+ stClearValue.Format = g_st6TimesRTAStatus.m_emRTAFormat;
+ stClearValue.Color[0] = g_stD3DDevice.m_faClearColor[0];
+ stClearValue.Color[1] = g_stD3DDevice.m_faClearColor[1];
+ stClearValue.Color[2] = g_stD3DDevice.m_faClearColor[2];
+ stClearValue.Color[3] = g_stD3DDevice.m_faClearColor[3];
+
+ // 创建离屏表面资源
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stRenderTargetDesc,
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
+ &stClearValue,
+ IID_PPV_ARGS(&g_st6TimesRTAStatus.m_pITextureRTA)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st6TimesRTAStatus.m_pITextureRTA);
+
+
+ //创建RTV(渲染目标视图)描述符堆( 这里是离屏表面的描述符堆 )
+ D3D12_DESCRIPTOR_HEAP_DESC stRTVHeapDesc = {};
+ stRTVHeapDesc.NumDescriptors = GRS_CUBE_MAP_FACE_CNT; // 6 Render Target Array RTV
+ stRTVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+ stRTVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stRTVHeapDesc, IID_PPV_ARGS(&g_st6TimesRTAStatus.m_pIRTAHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st6TimesRTAStatus.m_pIRTAHeap);
+
+ // 创建对应的RTV的描述符
+ D3D12_RENDER_TARGET_VIEW_DESC stRTADesc = {};
+ stRTADesc.Format = g_st6TimesRTAStatus.m_emRTAFormat;
+ stRTADesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
+ stRTADesc.Texture2DArray.ArraySize = 1;
+
+ // 为每个子资源创建一个RTV
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle = g_st6TimesRTAStatus.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+ for (UINT i = 0; i < GRS_CUBE_MAP_FACE_CNT; i++)
+ {
+ stRTADesc.Texture2DArray.FirstArraySlice = i;
+ g_stD3DDevice.m_pID3D12Device4->CreateRenderTargetView(g_st6TimesRTAStatus.m_pITextureRTA.Get(), &stRTADesc, stRTVHandle);
+ stRTVHandle.ptr += g_stD3DDevice.m_nRTVDescriptorSize;
+ }
+
+ D3D12_RESOURCE_DESC stDownloadResDesc = {};
+ stDownloadResDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ stDownloadResDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
+ stDownloadResDesc.Width = 0;
+ stDownloadResDesc.Height = 1;
+ stDownloadResDesc.DepthOrArraySize = 1;
+ stDownloadResDesc.MipLevels = 1;
+ stDownloadResDesc.Format = DXGI_FORMAT_UNKNOWN;
+ stDownloadResDesc.SampleDesc.Count = 1;
+ stDownloadResDesc.SampleDesc.Quality = 0;
+ stDownloadResDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ stDownloadResDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
+
+ UINT64 n64ResBufferSize = 0;
+
+ g_stD3DDevice.m_pID3D12Device4->GetCopyableFootprints(&stRenderTargetDesc
+ , 0, GRS_CUBE_MAP_FACE_CNT, 0, nullptr, nullptr, nullptr, &n64ResBufferSize);
+
+ stDownloadResDesc.Width = n64ResBufferSize;
+
+ // 后面的纹理需要将渲染的结果复制出来,必要的话需要存储至指定的文件,所以先变成Read Back堆
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_READBACK;
+ // Download Heap == Upload Heap 都是共享内存!
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stDownloadResDesc,
+ D3D12_RESOURCE_STATE_COPY_DEST,
+ nullptr,
+ IID_PPV_ARGS(&g_st6TimesRTAStatus.m_pITextureRTADownload)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_st6TimesRTAStatus.m_pITextureRTADownload);
+
+ // 还原为上传堆属性,后续还需要用
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
+
+ }
+
+ // 3-2-4、准备立方体和常量矩阵
+ {
+ ST_GRS_VERTEX_CUBE_BOX pstVertices[] = {
+ {{-1.0f, -1.0f, -1.0f,1.0f}},
+ {{-1.0f, +1.0f, -1.0f,1.0f}},
+ {{+1.0f, +1.0f, -1.0f,1.0f}},
+ {{+1.0f, -1.0f, -1.0f,1.0f}},
+ {{-1.0f, -1.0f, +1.0f,1.0f}},
+ {{-1.0f, +1.0f, +1.0f,1.0f}},
+ {{+1.0f, +1.0f, +1.0f,1.0f}},
+ {{+1.0f, -1.0f, +1.0f,1.0f}},
+ };
+
+ UINT16 arIndex[] = {
+ 0, 2, 1,
+ 0, 3, 2,
+
+ 4, 5, 6,
+ 4, 6, 7,
+
+ 4, 1, 5,
+ 4, 0, 1,
+
+ 3, 6, 2,
+ 3, 7, 6,
+
+ 1, 6, 5,
+ 1, 2, 6,
+
+ 4, 3, 0,
+ 4, 7, 3
+ };
+
+ g_stBoxData_Index.m_nIndexCount = _countof(arIndex);
+
+ const UINT64 nVertexBufferSize = sizeof(pstVertices);
+
+ g_stBufferResSesc.Width = GRS_UPPER(nVertexBufferSize, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ // 创建顶点缓冲 (共享内存中)
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stBoxData_Index.m_pIVB)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stBoxData_Index.m_pIVB);
+
+ UINT8* pBufferData = nullptr;
+ // map 大法 Copy 顶点数据到顶点缓冲中
+ GRS_THROW_IF_FAILED(g_stBoxData_Index.m_pIVB->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, pstVertices, nVertexBufferSize);
+ g_stBoxData_Index.m_pIVB->Unmap(0, nullptr);
+
+ // 创建顶点缓冲视图
+ g_stBoxData_Index.m_stVBV.BufferLocation = g_stBoxData_Index.m_pIVB->GetGPUVirtualAddress();
+ g_stBoxData_Index.m_stVBV.StrideInBytes = sizeof(ST_GRS_VERTEX_CUBE_BOX);
+ g_stBoxData_Index.m_stVBV.SizeInBytes = nVertexBufferSize;
+
+ // 索引缓冲
+ const UINT64 nIndexBufferSize = sizeof(arIndex);
+
+ g_stBufferResSesc.Width = GRS_UPPER(nIndexBufferSize, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ // 创建顶点缓冲 (共享内存中)
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stBoxData_Index.m_pIIB)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stBoxData_Index.m_pIIB);
+
+ // map 大法 Copy 顶点数据到顶点缓冲中
+ GRS_THROW_IF_FAILED(g_stBoxData_Index.m_pIIB->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, arIndex, nIndexBufferSize);
+ g_stBoxData_Index.m_pIIB->Unmap(0, nullptr);
+
+ // 创建顶点缓冲视图
+ g_stBoxData_Index.m_stIBV.BufferLocation = g_stBoxData_Index.m_pIIB->GetGPUVirtualAddress();
+ g_stBoxData_Index.m_stIBV.Format = DXGI_FORMAT_R16_UINT;
+ g_stBoxData_Index.m_stIBV.SizeInBytes = nIndexBufferSize;
+
+ // 创建常量缓冲的 CBV
+ D3D12_CPU_DESCRIPTOR_HANDLE stCBVHandle = g_stHDR2CubemapHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ D3D12_CONSTANT_BUFFER_VIEW_DESC stCBVDesc = {};
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVHandle);
+ }
+
+ // 3-2-5、执行6遍Cube Map 渲染,整个过程也只需要执行一次就生成了Cube Map6个面
+ {
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_st6TimesRTAStatus.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_stHDR2CubemapHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_stHDR2CubemapHeap.m_pISAPHeap.Get());
+
+ for (UINT i = 0; i < GRS_CUBE_MAP_FACE_CNT; i++)
+ {
+ // 等待前一遍命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+
+ //---------------------------------------------------------------------------
+ // 计算View矩阵 更新Const Buffer
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorld = XMMatrixIdentity();
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxView
+ = g_stWorldConstData.m_pstGSViewMatrix->m_mxGSCubeView[i];
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorldView
+ = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxView);
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWVP
+ = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxWorldView
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxProj);
+ //---------------------------------------------------------------------------
+
+ //开始执行渲染
+ //命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ g_stD3DDevice.m_pIMainCMDList->RSSetViewports(1, &g_st6TimesRTAStatus.m_stViewPort);
+ g_stD3DDevice.m_pIMainCMDList->RSSetScissorRects(1, &g_st6TimesRTAStatus.m_stScissorRect);
+
+ // 设置渲染目标 注意一次就把所有的离屏渲染目标放进去
+ g_stD3DDevice.m_pIMainCMDList->OMSetRenderTargets(1, &stRTVHandle, FALSE, nullptr);
+ // 清屏
+ g_stD3DDevice.m_pIMainCMDList->ClearRenderTargetView(stRTVHandle, g_stD3DDevice.m_faClearColor, 0, nullptr);
+
+ stRTVHandle.ptr += g_stD3DDevice.m_nRTVDescriptorSize;
+ //-----------------------------------------------------------------------------------------------------
+ // Draw !
+ //-----------------------------------------------------------------------------------------------------
+ // 渲染Cube
+ // 设置渲染管线状态对象
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootSignature(g_stHDR2CubemapPSO.m_pIRS.Get());
+ g_stD3DDevice.m_pIMainCMDList->SetPipelineState(g_stHDR2CubemapPSO.m_pIPSO.Get());
+
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUHandle = g_stHDR2CubemapHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ // 设置CBV
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(0, stGPUHandle);
+ // 设置SRV
+ stGPUHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(1, stGPUHandle);
+ // 设置Sample
+ stGPUHandle = g_stHDR2CubemapHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart();
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(2, stGPUHandle);
+
+ // 渲染手法:索引三角形
+ //g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ // 设置网格信息
+ g_stD3DDevice.m_pIMainCMDList->IASetVertexBuffers(0, 1, &g_stBoxData_Index.m_stVBV);
+ g_stD3DDevice.m_pIMainCMDList->IASetIndexBuffer(&g_stBoxData_Index.m_stIBV);
+ // Draw Call
+ g_stD3DDevice.m_pIMainCMDList->DrawIndexedInstanced(g_stBoxData_Index.m_nIndexCount, 1, 0, 0, 0);
+ //-----------------------------------------------------------------------------------------------------
+
+ // 使用资源屏障切换下状态,实际是与后面要使用这几个渲染目标的过程进行同步
+ // 这里为了简便直接变成Shader资源
+ g_st6TimesRTAStatus.m_stRTABarriers.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ g_st6TimesRTAStatus.m_stRTABarriers.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ g_st6TimesRTAStatus.m_stRTABarriers.Transition.pResource = g_st6TimesRTAStatus.m_pITextureRTA.Get();
+ g_st6TimesRTAStatus.m_stRTABarriers.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ g_st6TimesRTAStatus.m_stRTABarriers.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+ g_st6TimesRTAStatus.m_stRTABarriers.Transition.Subresource = i;
+ //资源屏障,用于确定渲染已经结束可以提交画面去显示了
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &g_st6TimesRTAStatus.m_stRTABarriers);
+
+ //关闭命令列表,可以去执行了
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+ }
+ }
+
+ //---------------------------------------------------------------------------------------
+ // 准备天空盒背景
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 4-1、创建天空盒的渲染管线状态对象
+ {
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[3] = {};
+
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = 1;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = 1;
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0;
+ // 在GPU上执行SetGraphicsRootDescriptorTable后,我们不修改命令列表中的SRV,因此我们可以使用默认Rang行为:
+ // D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[2].NumDescriptors = 1;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 0;
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[3] = {};
+
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stSkyBoxPSO.m_pIRS)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxPSO.m_pIRS);
+
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#else
+ nCompileFlags = 0;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszSMFileSkybox[MAX_PATH] = {};
+
+ StringCchPrintf(pszSMFileSkybox
+ , MAX_PATH
+ , _T("%s\\5-1 GRS_SkyBox_With_Spherical_Map.hlsl")
+ , g_pszShaderPath);
+
+ ComPtr pIVSSkybox;
+ ComPtr pIPSSkybox;
+
+ ComPtr pIErrorMsg;
+ // VS
+ HRESULT hr = D3DCompileFromFile(pszSMFileSkybox, nullptr, &grsD3DCompilerInclude
+ , "SkyboxVS", "vs_5_0", nCompileFlags, 0, &pIVSSkybox, &pIErrorBlob);
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszSMFileSkybox)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // PS
+ pIErrorBlob.Reset();
+ hr = D3DCompileFromFile(pszSMFileSkybox, nullptr, &grsD3DCompilerInclude
+ , "SkyboxPS", "ps_5_0", nCompileFlags, 0, &pIPSSkybox, &pIErrorBlob);
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszSMFileSkybox)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 天空盒子只有顶点只有位置参数
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+ stPSODesc.pRootSignature = g_stSkyBoxPSO.m_pIRS.Get();
+
+ stPSODesc.VS.BytecodeLength = pIVSSkybox->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSSkybox->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSSkybox->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSSkybox->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
+
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_stD3DDevice.m_emRenderTargetFormat;
+ stPSODesc.DSVFormat = g_stD3DDevice.m_emDepthStencilFormat;
+ stPSODesc.SampleDesc.Count = 1;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc
+ , IID_PPV_ARGS(&g_stSkyBoxPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxPSO.m_pIPSO);
+
+ // 创建 CBV SRV Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSRVHeapDesc = {};
+ stSRVHeapDesc.NumDescriptors = 2; // 1 CBV + 1 SRV
+ stSRVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+ stSRVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSRVHeapDesc
+ , IID_PPV_ARGS(&g_stSkyBoxHeap.m_pICBVSRVHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxHeap.m_pICBVSRVHeap);
+
+ // 创建 Sample Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSamplerHeapDesc = {};
+ stSamplerHeapDesc.NumDescriptors = 1; // 1 Sample
+ stSamplerHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
+ stSamplerHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSamplerHeapDesc
+ , IID_PPV_ARGS(&g_stSkyBoxHeap.m_pISAPHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxHeap.m_pISAPHeap);
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 4-2、准备天空盒基本数据
+ {
+ // 在OnSize的时候需要重新计算天空盒大小
+ float fHighW = -1.0f - (1.0f / (float)g_stD3DDevice.m_iWndWidth);
+ float fHighH = -1.0f - (1.0f / (float)g_stD3DDevice.m_iWndHeight);
+ float fLowW = 1.0f + (1.0f / (float)g_stD3DDevice.m_iWndWidth);
+ float fLowH = 1.0f + (1.0f / (float)g_stD3DDevice.m_iWndHeight);
+
+ ST_GRS_VERTEX_CUBE_BOX stSkyboxVertices[4] = {};
+
+ stSkyboxVertices[0].m_v4Position = XMFLOAT4(fLowW, fLowH, 1.0f, 1.0f);
+ stSkyboxVertices[1].m_v4Position = XMFLOAT4(fLowW, fHighH, 1.0f, 1.0f);
+ stSkyboxVertices[2].m_v4Position = XMFLOAT4(fHighW, fLowH, 1.0f, 1.0f);
+ stSkyboxVertices[3].m_v4Position = XMFLOAT4(fHighW, fHighH, 1.0f, 1.0f);
+
+ g_stSkyBoxData.m_nVertexCount = _countof(stSkyboxVertices);
+ //---------------------------------------------------------------------------------------------
+ //加载天空盒子的数据
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(stSkyboxVertices), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stSkyBoxData.m_pIVertexBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxData.m_pIVertexBuffer);
+
+ //使用map-memcpy-unmap大法将数据传至顶点缓冲对象
+ //注意顶点缓冲使用是和上传纹理数据缓冲相同的一个堆,这很神奇
+ ST_GRS_VERTEX_CUBE_BOX* pBufferData = nullptr;
+
+ GRS_THROW_IF_FAILED(g_stSkyBoxData.m_pIVertexBuffer->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, stSkyboxVertices, sizeof(stSkyboxVertices));
+ g_stSkyBoxData.m_pIVertexBuffer->Unmap(0, nullptr);
+
+ // 创建资源视图,实际可以简单理解为指向顶点缓冲的显存指针
+ g_stSkyBoxData.m_stVertexBufferView.BufferLocation = g_stSkyBoxData.m_pIVertexBuffer->GetGPUVirtualAddress();
+ g_stSkyBoxData.m_stVertexBufferView.StrideInBytes = sizeof(ST_GRS_VERTEX_CUBE_BOX);
+ g_stSkyBoxData.m_stVertexBufferView.SizeInBytes = sizeof(stSkyboxVertices);
+
+ // 使用全局常量缓冲区创建CBV
+ D3D12_CONSTANT_BUFFER_VIEW_DESC stCBVDesc = {};
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ D3D12_CPU_DESCRIPTOR_HANDLE cbvSrvHandleSkybox = { g_stSkyBoxHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart() };
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, cbvSrvHandleSkybox);
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 4-3、选择天空盒的高清版大图,用于天空渲染
+ {
+ TCHAR pszBigSkyImageFile[MAX_PATH] = {};
+ StringCchPrintf(pszBigSkyImageFile
+ , MAX_PATH
+ , _T("%s\\Tropical_Beach_8k.jpg")
+ , g_pszHDRFilePath);
+
+#ifdef GRS_USE_DIR_DIALOG
+ OPENFILENAME stOfn = {};
+
+ RtlZeroMemory(&stOfn, sizeof(stOfn));
+ stOfn.lStructSize = sizeof(stOfn);
+ stOfn.hwndOwner = ::GetDesktopWindow(); //g_stD3DDevice.m_hWnd;
+ stOfn.lpstrFilter = _T("jpg图片文件\0*.jpg\0HDR文件\0*.hdr\0所有文件\0*.*\0");
+ stOfn.lpstrFile = pszBigSkyImageFile;
+ stOfn.nMaxFile = MAX_PATH;
+ stOfn.lpstrTitle = _T("请选择一个高清的天空盒图片文件(不选默认用之前的HDR文件)...");
+ stOfn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
+
+ if (!::GetOpenFileName(&stOfn))
+ {
+ StringCchCopy(pszBigSkyImageFile, MAX_PATH, g_stHDRData.m_pszHDRFile);
+ }
+#endif
+ INT iImageWidth = 0;
+ INT iImageHeight = 0;
+ INT iImagePXComponents = 0;
+
+ // 下面这句意思是要不要上下颠倒一下图片
+ // 注意在OpenGL中纹理坐标纵方向是从下倒上所以需要颠倒一下
+ // 咱们是D3D 就不管了 所见即所得!
+ //stbi_set_flip_vertically_on_load(true);
+
+ // 这里需要注意的是,虽然高清版环境贴图是jpg图片,但任然使用 STB 库来加载
+ // 因为图片过大时 WIC 库就不行了,还没有深究其中原因
+ // 这也反应出 STB 库强大的能力
+ float* pfImageData = stbi_loadf(T2A(pszBigSkyImageFile)
+ , &iImageWidth
+ , &iImageHeight
+ , &iImagePXComponents
+ , 0);
+ if (nullptr == pfImageData)
+ {
+ ATLTRACE(_T("无法加载文件:\"%s\"\n"), pszBigSkyImageFile);
+ AtlThrowLastWin32();
+ }
+
+ if (3 != iImagePXComponents)
+ {
+ ATLTRACE(_T("文件:\"%s\",不是3部分Float格式,无法使用!\n"), pszBigSkyImageFile);
+ AtlThrowLastWin32();
+ }
+
+ UINT nRowAlign = 8u;
+ UINT nBPP = (UINT)iImagePXComponents * sizeof(float);
+
+ //UINT nPicRowPitch = ( iHDRWidth * nBPP + 7u ) / 8u;
+ UINT nPicRowPitch = GRS_UPPER(iImageWidth * nBPP, nRowAlign);
+
+ ID3D12Resource* pITextureUpload = nullptr;
+ ID3D12Resource* pITexture = nullptr;
+
+ // 等待前面的渲染命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+
+ //命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ // 加载图片 完成第一个Copy动作 并且 发出第二个Copy命令
+ BOOL bRet = LoadTextureFromMem(g_stD3DDevice.m_pIMainCMDList.Get()
+ , (BYTE*)pfImageData
+ , (size_t)iImageWidth * nBPP * iImageHeight
+ , DXGI_FORMAT_R32G32B32_FLOAT
+ , iImageWidth
+ , iImageHeight
+ , nPicRowPitch
+ , pITextureUpload
+ , pITexture
+ );
+
+ if (!bRet)
+ {
+ AtlThrowLastWin32();
+ }
+
+ g_stSkyBoxData.m_pITexture.Attach(pITexture);
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxData.m_pITexture);
+ g_stSkyBoxData.m_pITextureUpload.Attach(pITextureUpload);
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxData.m_pITextureUpload);
+
+ //关闭命令列表,执行一下 Copy 命令
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stHeapHandle
+ = g_stSkyBoxHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ stHeapHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize; // 按照管线的要求 第2个是SRV
+
+ D3D12_RESOURCE_DESC stResDesc = g_stSkyBoxData.m_pITexture->GetDesc();
+ // 创建 Skybox Texture SRV
+ D3D12_SHADER_RESOURCE_VIEW_DESC stSRVDesc = {};
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = stResDesc.Format;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ stSRVDesc.Texture2D.MipLevels = 1;
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(
+ g_stSkyBoxData.m_pITexture.Get()
+ , &stSRVDesc
+ , stHeapHandle);
+
+ // 创建一个线性过滤的边缘裁切的采样器
+ D3D12_SAMPLER_DESC stSamplerDesc = {};
+ stSamplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
+
+ stSamplerDesc.MinLOD = 0;
+ stSamplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
+ stSamplerDesc.MipLODBias = 0.0f;
+ stSamplerDesc.MaxAnisotropy = 1;
+ stSamplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+ stSamplerDesc.BorderColor[0] = 0.0f;
+ stSamplerDesc.BorderColor[1] = 0.0f;
+ stSamplerDesc.BorderColor[2] = 0.0f;
+ stSamplerDesc.BorderColor[3] = 0.0f;
+ stSamplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateSampler(&stSamplerDesc
+ , g_stSkyBoxHeap.m_pISAPHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+
+ {}
+ // 4-5、创建天空盒的捆绑包
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_BUNDLE
+ , IID_PPV_ARGS(&g_stSkyBoxPSO.m_pICmdAlloc)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxPSO.m_pICmdAlloc);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_BUNDLE
+ , g_stSkyBoxPSO.m_pICmdAlloc.Get(), nullptr, IID_PPV_ARGS(&g_stSkyBoxPSO.m_pICmdBundles)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stSkyBoxPSO.m_pICmdBundles);
+
+ //Skybox的捆绑包
+ g_stSkyBoxPSO.m_pICmdBundles->SetGraphicsRootSignature(g_stSkyBoxPSO.m_pIRS.Get());
+ g_stSkyBoxPSO.m_pICmdBundles->SetPipelineState(g_stSkyBoxPSO.m_pIPSO.Get());
+
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_stSkyBoxHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_stSkyBoxHeap.m_pISAPHeap.Get());
+
+ g_stSkyBoxPSO.m_pICmdBundles->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUCBVHandleSkybox
+ = g_stSkyBoxHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ //设置SRV
+ g_stSkyBoxPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(0, stGPUCBVHandleSkybox);
+ stGPUCBVHandleSkybox.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //设置CBV
+ g_stSkyBoxPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(1, stGPUCBVHandleSkybox);
+ g_stSkyBoxPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(2, g_stSkyBoxHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart());
+
+ g_stSkyBoxPSO.m_pICmdBundles->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ g_stSkyBoxPSO.m_pICmdBundles->IASetVertexBuffers(0, 1, &g_stSkyBoxData.m_stVertexBufferView);
+
+ //Draw Call!!!
+ g_stSkyBoxPSO.m_pICmdBundles->DrawInstanced(g_stSkyBoxData.m_nVertexCount, 1, 0, 0);
+ g_stSkyBoxPSO.m_pICmdBundles->Close();
+ }
+
+ //--------------------------------------------------------------------
+ // 基于HDR Image 的 PBR 渲染 IBL 部分
+ //--------------------------------------------------------------------
+ // 第一部分 漫反射部分
+ //--------------------------------------------------------------------
+ // 5-1-0、初始化Render Target的参数
+ {
+ g_stIBLDiffusePreIntRTA.m_nRTWidth = GRS_RTA_IBL_DIFFUSE_MAP_SIZE_W;
+ g_stIBLDiffusePreIntRTA.m_nRTHeight = GRS_RTA_IBL_DIFFUSE_MAP_SIZE_H;
+ g_stIBLDiffusePreIntRTA.m_stViewPort
+ = { 0.0f
+ , 0.0f
+ , static_cast(g_stIBLDiffusePreIntRTA.m_nRTWidth)
+ , static_cast(g_stIBLDiffusePreIntRTA.m_nRTHeight)
+ , D3D12_MIN_DEPTH
+ , D3D12_MAX_DEPTH };
+ g_stIBLDiffusePreIntRTA.m_stScissorRect
+ = { 0
+ , 0
+ , static_cast(g_stIBLDiffusePreIntRTA.m_nRTWidth)
+ , static_cast(g_stIBLDiffusePreIntRTA.m_nRTHeight) };
+
+ g_stIBLDiffusePreIntRTA.m_emRTAFormat = DXGI_FORMAT_R32G32B32A32_FLOAT;
+ }
+ // 5-1-1、创建利用 Geometry shader 1Times 渲染到 Cube Map 的 IBL Diffuse Pre Integration PSO
+ {
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[3] = {};
+ // 2 Const Buffer ( MVP Matrix + Cube Map 6 View Matrix)
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = 2;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Texture ( HDR Texture )
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = 1;
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0;
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Sampler ( Linear Sampler )
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[2].NumDescriptors = 1;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 0;
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[3] = {};
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//CBV是所有Shader可见
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SRV仅PS可见
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SAMPLE仅PS可见
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stIBLDiffusePreIntPSO.m_pIRS)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLDiffusePreIntPSO.m_pIRS);
+
+ //--------------------------------------------------------------------------------------------------------------------------------
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+
+ ComPtr pIVSCode;
+ ComPtr pIGSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\1-2 GRS_1Times_GS_HDR_2_CubeMap_VS_GS.hlsl")
+ , g_pszShaderPath);
+
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_0", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "GSMain", "gs_5_0", nCompileFlags, 0, &pIGSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Geometry Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 这里要注意我们果断的选择使用改良后的 蒙特卡洛 版的 漫反射积分贴图算法的版本
+ // 而不是基于朴素的基础数值积分的版本
+ // 主要是因为基础积分版本的计算量太大了,一个像素基本都需要上百万量级的计算
+ // 一般的显卡根本扛不住,还有烧毁的可能
+ // 朴素基础积分方法的版本仅仅是为了让大家了解并掌握IBL漫反射贴图生成的基本原理而已
+ // 是用来读的,而不是用来执行的,切记切记!
+ // 这里郑重警告千万不要使用朴素积分的这个版本,否则显卡烧毁或其它意外可能会造成损失
+ // 本人对一切后果不负责!
+ //::StringCchPrintf(pszShaderFileName
+ // , MAX_PATH
+ // , _T("%s\\2-1 GRS_IBL_Diffuse_Irradiance_Convolution_With_Integration_PS.hlsl")
+ // , g_pszShaderPath);
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\2-2 GRS_IBL_Diffuse_Irradiance_Convolution_With_Monte_Carlo_PS.hlsl")
+ , g_pszShaderPath);
+
+ //::StringCchPrintf(pszShaderFileName
+ // , MAX_PATH
+ // , _T("%s\\GRS_IBL_Diffuse_Irradiance_Convolution_With_Integration_PS.hlsl")
+ // , g_pszShaderPath);
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_0", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+
+ stPSODesc.pRootSignature = g_stIBLDiffusePreIntPSO.m_pIRS.Get();
+
+ // VS -> GS -> PS
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.GS.BytecodeLength = pIGSCode->GetBufferSize();
+ stPSODesc.GS.pShaderBytecode = pIGSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_stIBLDiffusePreIntRTA.m_emRTAFormat;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc, IID_PPV_ARGS(&g_stIBLDiffusePreIntPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLDiffusePreIntPSO.m_pIPSO);
+
+ // IBL Diffuse Pre Integration 渲染使用与HDR to Cubemap GS渲染过程中相同的CBV、Sample 、VB、Const Buffer
+ // 并且使用其渲染结果作为自身的SRV
+ D3D12_CPU_DESCRIPTOR_HANDLE stHeapHandle = g_st1TimesGSHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ stHeapHandle.ptr += (g_st1TimesGSHeap.m_nSRVOffset * g_stD3DDevice.m_nCBVSRVDescriptorSize); // 按照管线的要求偏移到正确的 SRV 插槽
+
+ // 创建 HDR Texture SRV
+ D3D12_SHADER_RESOURCE_VIEW_DESC stSRVDesc = {};
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = g_st1TimesGSRTAStatus.m_emRTAFormat;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
+ stSRVDesc.TextureCube.MipLevels = 1;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_st1TimesGSRTAStatus.m_pITextureRTA.Get()
+ , &stSRVDesc, stHeapHandle);
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 5-1-2、创建 IBL Diffuse Pre Integration Render Target
+ {
+ // 注意这里创建的离屏渲染目标资源,必须是Texture2DArray类型,并且有6个SubResource
+ // 这是适合 Geometry Shader 一次渲染多个 Render Target Array 的方式。
+ // 在 Geometry Shader 中使用系统变量 SV_RenderTargetArrayIndex 标识 Render Target的索引。
+ // 多个独立 Texture Render Target 的方案适用于真正 MRT 的 GBuffer 中,
+ // 一般在 Pixel Shader 中使用 SV_Target(n) 来标识具体的 Render Target,其中 n 为索引
+ // 如:SV_Target0、SV_Target1、SV_Target2 等
+
+ // 创建离屏渲染目标(Render Target Array Texture2DArray)
+
+ D3D12_RESOURCE_DESC stRenderTargetDesc = g_stD3DDevice.m_pIARenderTargets[0]->GetDesc();
+ stRenderTargetDesc.Format = g_stIBLDiffusePreIntRTA.m_emRTAFormat;
+ stRenderTargetDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stRenderTargetDesc.Width = g_stIBLDiffusePreIntRTA.m_nRTWidth;
+ stRenderTargetDesc.Height = g_stIBLDiffusePreIntRTA.m_nRTHeight;
+ stRenderTargetDesc.DepthOrArraySize = GRS_CUBE_MAP_FACE_CNT;
+
+ D3D12_CLEAR_VALUE stClearValue = {};
+ stClearValue.Format = g_stIBLDiffusePreIntRTA.m_emRTAFormat;
+ stClearValue.Color[0] = g_stD3DDevice.m_faClearColor[0];
+ stClearValue.Color[1] = g_stD3DDevice.m_faClearColor[1];
+ stClearValue.Color[2] = g_stD3DDevice.m_faClearColor[2];
+ stClearValue.Color[3] = g_stD3DDevice.m_faClearColor[3];
+
+ // 创建离屏表面资源
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stRenderTargetDesc,
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
+ &stClearValue,
+ IID_PPV_ARGS(&g_stIBLDiffusePreIntRTA.m_pITextureRTA)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLDiffusePreIntRTA.m_pITextureRTA);
+
+
+ //创建RTV(渲染目标视图)描述符堆( 这里是离屏表面的描述符堆 )
+ D3D12_DESCRIPTOR_HEAP_DESC stRTVHeapDesc = {};
+ stRTVHeapDesc.NumDescriptors = 1; // 1 Render Target Array RTV
+ stRTVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+ stRTVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stRTVHeapDesc
+ , IID_PPV_ARGS(&g_stIBLDiffusePreIntRTA.m_pIRTAHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLDiffusePreIntRTA.m_pIRTAHeap);
+
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stIBLDiffusePreIntRTA.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ D3D12_RENDER_TARGET_VIEW_DESC stRTADesc = {};
+ stRTADesc.Format = g_stIBLDiffusePreIntRTA.m_emRTAFormat;
+ stRTADesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
+ stRTADesc.Texture2DArray.ArraySize = GRS_CUBE_MAP_FACE_CNT;
+
+ // 创建对应的RTV的描述符
+ // 这里的D3D12_RENDER_TARGET_VIEW_DESC结构很重要,
+ // 这是使用Texture2DArray作为Render Target Array时必须要明确填充的结构体,
+ // 否则 Geometry Shader 没法识别这个Array
+ // 一般创建 Render Target 时不填充这个结构,
+ // 直接在 CreateRenderTargetView 的第二个参数传入nullptr
+
+ g_stD3DDevice.m_pID3D12Device4->CreateRenderTargetView(g_stIBLDiffusePreIntRTA.m_pITextureRTA.Get(), &stRTADesc, stRTVHandle);
+
+ D3D12_RESOURCE_DESC stDownloadResDesc = {};
+ stDownloadResDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ stDownloadResDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
+ stDownloadResDesc.Width = 0;
+ stDownloadResDesc.Height = 1;
+ stDownloadResDesc.DepthOrArraySize = 1;
+ stDownloadResDesc.MipLevels = 1;
+ stDownloadResDesc.Format = DXGI_FORMAT_UNKNOWN;
+ stDownloadResDesc.SampleDesc.Count = 1;
+ stDownloadResDesc.SampleDesc.Quality = 0;
+ stDownloadResDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ stDownloadResDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
+
+ UINT64 n64ResBufferSize = 0;
+
+ g_stD3DDevice.m_pID3D12Device4->GetCopyableFootprints(&stRenderTargetDesc
+ , 0, GRS_CUBE_MAP_FACE_CNT, 0, nullptr, nullptr, nullptr, &n64ResBufferSize);
+
+ stDownloadResDesc.Width = n64ResBufferSize;
+
+ // 后面的纹理需要将渲染的结果复制出来,必要的话需要存储至指定的文件,所以先变成Read Back堆
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_READBACK;
+ // Download Heap == Upload Heap 都是共享内存!
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stDownloadResDesc,
+ D3D12_RESOURCE_STATE_COPY_DEST,
+ nullptr,
+ IID_PPV_ARGS(&g_stIBLDiffusePreIntRTA.m_pITextureRTADownload)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLDiffusePreIntRTA.m_pITextureRTADownload);
+
+ // 还原为上传堆属性,后续还需要用
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
+
+ }
+
+ // 5-1-3、渲染进行IBL Diffuse Map的预积分计算
+ {}
+ {
+ // 等待前面的Copy命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+ // 开始执行 GS Cube Map渲染,将HDR等距柱面纹理 一次性渲染至6个RTV
+ //命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ g_stD3DDevice.m_pIMainCMDList->RSSetViewports(1, &g_stIBLDiffusePreIntRTA.m_stViewPort);
+ g_stD3DDevice.m_pIMainCMDList->RSSetScissorRects(1, &g_stIBLDiffusePreIntRTA.m_stScissorRect);
+
+ // 设置渲染目标 注意一次就把所有的离屏渲染目标放进去
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stIBLDiffusePreIntRTA.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+ g_stD3DDevice.m_pIMainCMDList->OMSetRenderTargets(1, &stRTVHandle, FALSE, nullptr);
+
+ // 继续记录命令,并真正开始渲染
+ g_stD3DDevice.m_pIMainCMDList->ClearRenderTargetView(stRTVHandle, g_stD3DDevice.m_faClearColor, 0, nullptr);
+
+ //-----------------------------------------------------------------------------------------------------
+ // Draw !
+ //-----------------------------------------------------------------------------------------------------
+ // 渲染Cube
+ // 设置渲染管线状态对象
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootSignature(g_stIBLDiffusePreIntPSO.m_pIRS.Get());
+ g_stD3DDevice.m_pIMainCMDList->SetPipelineState(g_stIBLDiffusePreIntPSO.m_pIPSO.Get());
+
+ // IBL Diffuse Pre Integration 渲染使用与HDR to Cubemap GS渲染过程中
+ // 相同的CBV、Sample 、VB、Const Buffer
+ // 并且使用其渲染结果作为自身的SRV
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_st1TimesGSHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_st1TimesGSHeap.m_pISAPHeap.Get());
+
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUHandle = g_st1TimesGSHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ // 设置CBV
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(0, stGPUHandle);
+ // 设置SRV
+ stGPUHandle.ptr += (g_st1TimesGSHeap.m_nSRVOffset * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(1, stGPUHandle);
+ // 设置Sample
+ stGPUHandle = g_st1TimesGSHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart();
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(2, stGPUHandle);
+
+ // 渲染手法:三角形带
+ g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ // 设置网格信息
+ g_stD3DDevice.m_pIMainCMDList->IASetVertexBuffers(0, 1, &g_stBoxData_Strip.m_stVertexBufferView);
+ // Draw Call
+ g_stD3DDevice.m_pIMainCMDList->DrawInstanced(g_stBoxData_Strip.m_nVertexCount, 1, 0, 0);
+ //-----------------------------------------------------------------------------------------------------
+ // 使用资源屏障切换下状态,实际是与后面要使用这几个渲染目标的过程进行同步
+ g_stIBLDiffusePreIntRTA.m_stRTABarriers.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ g_stIBLDiffusePreIntRTA.m_stRTABarriers.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ g_stIBLDiffusePreIntRTA.m_stRTABarriers.Transition.pResource = g_stIBLDiffusePreIntRTA.m_pITextureRTA.Get();
+ g_stIBLDiffusePreIntRTA.m_stRTABarriers.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ g_stIBLDiffusePreIntRTA.m_stRTABarriers.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+ g_stIBLDiffusePreIntRTA.m_stRTABarriers.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+ //资源屏障,用于确定渲染已经结束可以提交画面去显示了
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &g_stIBLDiffusePreIntRTA.m_stRTABarriers);
+
+ //关闭命令列表,可以去执行了
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+ }
+ //--------------------------------------------------------------------
+
+ //--------------------------------------------------------------------
+ // 第二部分 镜面反射部分
+ //--------------------------------------------------------------------
+ // 5-2-0、初始化 Render Target 参数
+ {
+ g_stIBLSpecularPreIntRTA.m_nRTWidth = GRS_RTA_IBL_SPECULAR_MAP_SIZE_W;
+ g_stIBLSpecularPreIntRTA.m_nRTHeight = GRS_RTA_IBL_SPECULAR_MAP_SIZE_H;
+ g_stIBLSpecularPreIntRTA.m_stViewPort = { 0.0f, 0.0f, static_cast(g_stIBLSpecularPreIntRTA.m_nRTWidth), static_cast(g_stIBLDiffusePreIntRTA.m_nRTHeight), D3D12_MIN_DEPTH, D3D12_MAX_DEPTH };
+ g_stIBLSpecularPreIntRTA.m_stScissorRect = { 0, 0, static_cast(g_stIBLSpecularPreIntRTA.m_nRTWidth), static_cast(g_stIBLDiffusePreIntRTA.m_nRTHeight) };
+ g_stIBLSpecularPreIntRTA.m_emRTAFormat = DXGI_FORMAT_R32G32B32A32_FLOAT;
+ }
+
+ // 5-2-1、创建利用 Geometry shader 1Times 渲染到 Cube Map 的 IBL Specular Pre Integration PSO
+ {
+ // 注意 镜面反射预积分的时候 用到了 PBR Material 中的 粗糙度参数 所以要设置5 个常量缓冲
+ // 实际运行中只使用了这一个参数
+
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[3] = {};
+ // 5 Const Buffer ( MVP Matrix + Cube Map 6 View Matrix)
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = 5;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Texture ( HDR Texture )
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = 1;
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0;
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Sampler ( Linear Sampler )
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[2].NumDescriptors = 1;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 0;
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[3] = {};
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//CBV是所有Shader可见
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SRV仅PS可见
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SAMPLE仅PS可见
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stIBLSpecularPreIntPSO.m_pIRS)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLSpecularPreIntPSO.m_pIRS);
+
+ //--------------------------------------------------------------------------------------------------------------------------------
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+
+ ComPtr pIVSCode;
+ ComPtr pIGSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\1-2 GRS_1Times_GS_HDR_2_CubeMap_VS_GS.hlsl"), g_pszShaderPath);
+
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_0", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ hr = ::D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "GSMain", "gs_5_0", nCompileFlags, 0, &pIGSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Geometry Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\3-1 GRS_IBL_Specular_Pre_Integration_PS.hlsl")
+ , g_pszShaderPath);
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_0", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+
+ stPSODesc.pRootSignature = g_stIBLSpecularPreIntPSO.m_pIRS.Get();
+
+ // VS -> GS -> PS
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.GS.BytecodeLength = pIGSCode->GetBufferSize();
+ stPSODesc.GS.pShaderBytecode = pIGSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ //stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_WIREFRAME;
+ // 关掉背面剔除
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_stIBLSpecularPreIntRTA.m_emRTAFormat;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc, IID_PPV_ARGS(&g_stIBLSpecularPreIntPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLSpecularPreIntPSO.m_pIPSO);
+
+ // IBL Specular Pre Integration 渲染
+ // 使用与HDR to Cubemap GS渲染过程中相同的CBV、Sample 、VB、Const Buffer
+ // 并且使用其渲染结果作为自身的SRV
+ // 之前 Diffuse 渲染已经创建好了 这里就不用再创建了 直接复用即可
+ }
+
+ {}//别问我这样的空花括号是干嘛的,因为大纲显示失效了,前置这个就可以恢复大纲显示 VS2019的BUG VS2022依旧。。。。。。
+ // 5-2-2、创建 IBL Specular Pre Integration Render Target(重要性采样和蒙特卡洛积分)
+ {
+ // 注意这里创建的离屏渲染目标资源,必须是Texture2DArray类型,并且有6个SubResource
+ // 这是适合 Geometry Shader 一次渲染多个 Render Target Array 的方式。
+ // 在 Geometry Shader 中使用系统变量 SV_RenderTargetArrayIndex 标识 Render Target的索引。
+ // 多个独立 Texture Render Target 的方案适用于真正 MRT 的 GBuffer 中,
+ // 一般在 Pixel Shader 中使用 SV_Target(n) 来标识具体的 Render Target,其中 n 为索引
+ // 如:SV_Target0、SV_Target1、SV_Target2 等
+
+ // 创建离屏渲染目标(Render Target Array Texture2DArray)
+
+ D3D12_RESOURCE_DESC stRenderTargetDesc = g_stD3DDevice.m_pIARenderTargets[0]->GetDesc();
+ stRenderTargetDesc.Format = g_stIBLSpecularPreIntRTA.m_emRTAFormat;
+ stRenderTargetDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stRenderTargetDesc.Width = g_stIBLSpecularPreIntRTA.m_nRTWidth;
+ stRenderTargetDesc.Height = g_stIBLSpecularPreIntRTA.m_nRTHeight;
+ // 6个面、每个面5级Mip、总共5*6 = 30个SubResource
+ stRenderTargetDesc.DepthOrArraySize = GRS_CUBE_MAP_FACE_CNT;
+ stRenderTargetDesc.MipLevels = GRS_RTA_IBL_SPECULAR_MAP_MIP;
+
+
+ D3D12_CLEAR_VALUE stClearValue = {};
+ stClearValue.Format = g_stIBLSpecularPreIntRTA.m_emRTAFormat;
+ stClearValue.Color[0] = g_stD3DDevice.m_faClearColor[0];
+ stClearValue.Color[1] = g_stD3DDevice.m_faClearColor[1];
+ stClearValue.Color[2] = g_stD3DDevice.m_faClearColor[2];
+ stClearValue.Color[3] = g_stD3DDevice.m_faClearColor[3];
+
+ // 创建离屏表面资源
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stRenderTargetDesc,
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
+ &stClearValue,
+ IID_PPV_ARGS(&g_stIBLSpecularPreIntRTA.m_pITextureRTA)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLSpecularPreIntRTA.m_pITextureRTA);
+
+ //创建RTV(渲染目标视图)描述符堆( 这里是离屏表面的描述符堆 )
+ D3D12_DESCRIPTOR_HEAP_DESC stRTVHeapDesc = {};
+ // GRS_RTA_IBL_SPECULAR_MAP_MIP 个 Render Target Array RTV
+ stRTVHeapDesc.NumDescriptors = GRS_RTA_IBL_SPECULAR_MAP_MIP;
+ stRTVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+ stRTVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stRTVHeapDesc
+ , IID_PPV_ARGS(&g_stIBLSpecularPreIntRTA.m_pIRTAHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLSpecularPreIntRTA.m_pIRTAHeap);
+
+ // 创建对应的RTV的描述符
+ // 这里的D3D12_RENDER_TARGET_VIEW_DESC结构很重要,
+ // 这是使用Texture2DArray作为Render Target Array时必须要明确填充的结构体,
+ // 否则 Geometry Shader 没法识别这个Array
+ // 一般创建 Render Target 时不填充这个结构,
+ // 直接在 CreateRenderTargetView 的第二个参数传入nullptr
+
+ D3D12_RENDER_TARGET_VIEW_DESC stRTADesc = {};
+ stRTADesc.Format = g_stIBLSpecularPreIntRTA.m_emRTAFormat;
+ stRTADesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY;
+ stRTADesc.Texture2DArray.ArraySize = GRS_CUBE_MAP_FACE_CNT;
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stIBLSpecularPreIntRTA.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ for (UINT i = 0; i < GRS_RTA_IBL_SPECULAR_MAP_MIP; i++)
+ {
+ stRTADesc.Texture2DArray.MipSlice = i;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateRenderTargetView(
+ g_stIBLSpecularPreIntRTA.m_pITextureRTA.Get()
+ , &stRTADesc
+ , stRTVHandle);
+
+ stRTVHandle.ptr += g_stD3DDevice.m_nRTVDescriptorSize;
+ }
+
+ D3D12_RESOURCE_DESC stDownloadResDesc = {};
+ stDownloadResDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ stDownloadResDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
+ stDownloadResDesc.Width = 0;
+ stDownloadResDesc.Height = 1;
+ stDownloadResDesc.DepthOrArraySize = 1;
+ stDownloadResDesc.MipLevels = 1;
+ stDownloadResDesc.Format = DXGI_FORMAT_UNKNOWN;
+ stDownloadResDesc.SampleDesc.Count = 1;
+ stDownloadResDesc.SampleDesc.Quality = 0;
+ stDownloadResDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ stDownloadResDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
+
+ UINT64 n64ResBufferSize = 0;
+
+ stRenderTargetDesc = g_stIBLSpecularPreIntRTA.m_pITextureRTA->GetDesc();
+
+ g_stD3DDevice.m_pID3D12Device4->GetCopyableFootprints(&stRenderTargetDesc
+ , 0, GRS_CUBE_MAP_FACE_CNT, 0, nullptr, nullptr, nullptr, &n64ResBufferSize);
+
+ stDownloadResDesc.Width = n64ResBufferSize;
+
+ // 后面的纹理需要将渲染的结果复制出来,必要的话需要存储至指定的文件,所以先变成Read Back堆
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_READBACK;
+ // Download Heap == Upload Heap 都是共享内存!
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stDownloadResDesc,
+ D3D12_RESOURCE_STATE_COPY_DEST,
+ nullptr,
+ IID_PPV_ARGS(&g_stIBLSpecularPreIntRTA.m_pITextureRTADownload)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLSpecularPreIntRTA.m_pITextureRTADownload);
+
+ // 还原为上传堆属性,后续还需要用
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
+
+ }
+
+ // 5-2-3、渲染进行IBL Specular Map的预积分计算(重要性采样和蒙特卡洛积分)
+ {}
+ {
+ // IBL Specular Pre Integration 渲染使用与HDR to Cubemap GS渲染过程中
+ // 相同的CBV、Sample 、VB、Const Buffer
+ // 并且使用其渲染结果作为自身的SRV
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_st1TimesGSHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_st1TimesGSHeap.m_pISAPHeap.Get());
+
+ D3D12_RESOURCE_BARRIER stSubResBarrier[GRS_CUBE_MAP_FACE_CNT] = {};
+ for (UINT i = 0; i < GRS_CUBE_MAP_FACE_CNT; i++)
+ {
+ stSubResBarrier[i].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ stSubResBarrier[i].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ stSubResBarrier[i].Transition.pResource = g_stIBLSpecularPreIntRTA.m_pITextureRTA.Get();
+ stSubResBarrier[i].Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ stSubResBarrier[i].Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+ stSubResBarrier[i].Transition.Subresource = 0;
+ }
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stIBLSpecularPreIntRTA.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ for (UINT i = 0; i < GRS_RTA_IBL_SPECULAR_MAP_MIP; i++)
+ {// 按照MipLevel循环 i 是 Mip Slice
+ // 等待前面的命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+
+ // 计算MipLevel
+ UINT nRTWidth = g_stIBLSpecularPreIntRTA.m_nRTWidth >> i;
+ UINT nRTHeight = g_stIBLSpecularPreIntRTA.m_nRTHeight >> i;
+
+ D3D12_VIEWPORT stViewPort
+ = { 0.0f
+ , 0.0f
+ , static_cast(nRTWidth)
+ , static_cast(nRTHeight)
+ , D3D12_MIN_DEPTH
+ , D3D12_MAX_DEPTH };
+ D3D12_RECT stScissorRect
+ = { 0, 0, static_cast(nRTWidth), static_cast(nRTHeight) };
+
+ // 预过滤的时候 每个MipLevel 对应一个粗糙度等级 这样MipMap时 启用线性插值会保证正确的结果
+ g_stWorldConstData.m_pstPBRMaterial->m_fRoughness = (float)i / (float)(GRS_RTA_IBL_SPECULAR_MAP_MIP - 1);
+ g_stWorldConstData.m_pstPBRMaterial->m_v4Albedo = { 1.0f,1.0f,1.0f };
+ g_stWorldConstData.m_pstPBRMaterial->m_fMetallic = 1.0f;
+ g_stWorldConstData.m_pstPBRMaterial->m_fAO = 0.1f;
+
+ // 开始执行 GS Cube Map渲染,一次性渲染至6个RTV
+ //命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ g_stD3DDevice.m_pIMainCMDList->RSSetViewports(1, &stViewPort);
+ g_stD3DDevice.m_pIMainCMDList->RSSetScissorRects(1, &stScissorRect);
+
+ g_stD3DDevice.m_pIMainCMDList->OMSetRenderTargets(1, &stRTVHandle, FALSE, nullptr);
+
+ // 继续记录命令,并真正开始渲染
+ g_stD3DDevice.m_pIMainCMDList->ClearRenderTargetView(stRTVHandle, g_stD3DDevice.m_faClearColor, 0, nullptr);
+ //-----------------------------------------------------------------------------------------------------
+ // Draw !
+ //-----------------------------------------------------------------------------------------------------
+ // 渲染Cube
+ // 设置渲染管线状态对象
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootSignature(g_stIBLSpecularPreIntPSO.m_pIRS.Get());
+ g_stD3DDevice.m_pIMainCMDList->SetPipelineState(g_stIBLSpecularPreIntPSO.m_pIPSO.Get());
+
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUHandle = g_st1TimesGSHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ // 设置CBV
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(0, stGPUHandle);
+ // 设置SRV
+ stGPUHandle.ptr += (g_st1TimesGSHeap.m_nSRVOffset * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(1, stGPUHandle);
+ // 设置Sample
+ stGPUHandle = g_st1TimesGSHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart();
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(2, stGPUHandle);
+
+ // 渲染手法:三角形带
+ g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ // 设置网格信息
+ g_stD3DDevice.m_pIMainCMDList->IASetVertexBuffers(0, 1, &g_stBoxData_Strip.m_stVertexBufferView);
+ // Draw Call
+ g_stD3DDevice.m_pIMainCMDList->DrawInstanced(g_stBoxData_Strip.m_nVertexCount, 1, 0, 0);
+ //-----------------------------------------------------------------------------------------------------
+ // 使用资源屏障切换下状态,实际是与后面要使用这几个渲染目标的过程进行同步
+ for (UINT j = 0; j < GRS_CUBE_MAP_FACE_CNT; j++)
+ {// 计算下子资源
+ stSubResBarrier[j].Transition.Subresource = (j * GRS_RTA_IBL_SPECULAR_MAP_MIP) + i;
+ }
+
+ //资源屏障,用于确定渲染已经结束可以提交画面去显示了
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(GRS_CUBE_MAP_FACE_CNT, stSubResBarrier);
+
+ //关闭命令列表,可以去执行了
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+
+ stRTVHandle.ptr += g_stD3DDevice.m_nRTVDescriptorSize;
+ }
+ }
+ //--------------------------------------------------------------------
+
+ //--------------------------------------------------------------------
+ // 第三部分 LUT部分 (生成 BRDF 积分贴图)
+ //--------------------------------------------------------------------
+ {}
+ // 5-3-0、初始化 BRDF积分贴图 相关参数
+ {
+ g_stIBLLutRTA.m_nRTWidth = GRS_RTA_IBL_LUT_SIZE_W;
+ g_stIBLLutRTA.m_nRTHeight = GRS_RTA_IBL_LUT_SIZE_H;
+ g_stIBLLutRTA.m_stViewPort
+ = { 0.0f
+ , 0.0f
+ , static_cast(g_stIBLLutRTA.m_nRTWidth)
+ , static_cast(g_stIBLLutRTA.m_nRTHeight)
+ , D3D12_MIN_DEPTH
+ , D3D12_MAX_DEPTH };
+ g_stIBLLutRTA.m_stScissorRect
+ = { 0
+ , 0
+ , static_cast(g_stIBLLutRTA.m_nRTWidth)
+ , static_cast(g_stIBLLutRTA.m_nRTHeight) };
+
+ g_stIBLLutRTA.m_emRTAFormat = GRS_RTA_IBL_LUT_FORMAT;
+ }
+
+ // 5-3-1、创建 BRDF 积分贴图 PSO
+ {
+ // LUT PSO 不需要常量缓冲或者纹理
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = 0;
+ stRootSignatureDesc.Desc_1_1.pParameters = nullptr;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stIBLLutPSO.m_pIRS)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLLutPSO.m_pIRS);
+
+ //--------------------------------------------------------------------------------------------------------------------------------
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+
+ ComPtr pIVSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\3-2 GRS_IBL_BRDF_Integration_LUT.hlsl"), g_pszShaderPath);
+
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_0", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_0", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 16, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+
+ stPSODesc.pRootSignature = g_stIBLLutPSO.m_pIRS.Get();
+
+ // VS -> PS
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ //stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_WIREFRAME;
+ // 关掉背面剔除
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_stIBLLutRTA.m_emRTAFormat;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc, IID_PPV_ARGS(&g_stIBLLutPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLLutPSO.m_pIPSO);
+ }
+
+ {}
+ // 5-3-2、创建 BRDF积分贴图 Render Target(重要性采样和蒙特卡洛积分)
+ {
+ // 创建离屏渲染目标(Render Target Array Texture2DArray)
+ D3D12_RESOURCE_DESC stRenderTargetDesc = g_stD3DDevice.m_pIARenderTargets[0]->GetDesc();
+ stRenderTargetDesc.Format = g_stIBLLutRTA.m_emRTAFormat;
+ stRenderTargetDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stRenderTargetDesc.Width = g_stIBLLutRTA.m_nRTWidth;
+ stRenderTargetDesc.Height = g_stIBLLutRTA.m_nRTHeight;
+ stRenderTargetDesc.DepthOrArraySize = 1;
+ stRenderTargetDesc.MipLevels = 1;
+
+
+ D3D12_CLEAR_VALUE stClearValue = {};
+ stClearValue.Format = g_stIBLLutRTA.m_emRTAFormat;
+ stClearValue.Color[0] = g_stD3DDevice.m_faClearColor[0];
+ stClearValue.Color[1] = g_stD3DDevice.m_faClearColor[1];
+ stClearValue.Color[2] = g_stD3DDevice.m_faClearColor[2];
+ stClearValue.Color[3] = g_stD3DDevice.m_faClearColor[3];
+
+ // 创建离屏表面资源
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stRenderTargetDesc,
+ D3D12_RESOURCE_STATE_RENDER_TARGET,
+ &stClearValue,
+ IID_PPV_ARGS(&g_stIBLLutRTA.m_pITextureRTA)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLLutRTA.m_pITextureRTA);
+
+
+ //创建RTV(渲染目标视图)描述符堆( 这里是离屏表面的描述符堆 )
+ D3D12_DESCRIPTOR_HEAP_DESC stRTVHeapDesc = {};
+ // GRS_RTA_IBL_SPECULAR_MAP_MIP 个 Render Target Array RTV
+ stRTVHeapDesc.NumDescriptors = 1;
+ stRTVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+ stRTVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stRTVHeapDesc
+ , IID_PPV_ARGS(&g_stIBLLutRTA.m_pIRTAHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLLutRTA.m_pIRTAHeap);
+
+ // 创建对应的RTV的描述符
+ // 这里的D3D12_RENDER_TARGET_VIEW_DESC结构很重要,
+ // 这是使用Texture2DArray作为Render Target Array时必须要明确填充的结构体,
+ // 否则 Geometry Shader 没法识别这个Array
+ // 一般创建 Render Target 时不填充这个结构,
+ // 直接在 CreateRenderTargetView 的第二个参数传入nullptr
+
+ D3D12_RENDER_TARGET_VIEW_DESC stRTADesc = {};
+ stRTADesc.Format = g_stIBLLutRTA.m_emRTAFormat;
+ stRTADesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stIBLLutRTA.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ g_stD3DDevice.m_pID3D12Device4->CreateRenderTargetView(
+ g_stIBLLutRTA.m_pITextureRTA.Get()
+ , &stRTADesc
+ , stRTVHandle);
+
+ D3D12_RESOURCE_DESC stDownloadResDesc = {};
+ stDownloadResDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
+ stDownloadResDesc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
+ stDownloadResDesc.Width = 0;
+ stDownloadResDesc.Height = 1;
+ stDownloadResDesc.DepthOrArraySize = 1;
+ stDownloadResDesc.MipLevels = 1;
+ stDownloadResDesc.Format = DXGI_FORMAT_UNKNOWN;
+ stDownloadResDesc.SampleDesc.Count = 1;
+ stDownloadResDesc.SampleDesc.Quality = 0;
+ stDownloadResDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
+ stDownloadResDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
+
+ UINT64 n64ResBufferSize = 0;
+
+ stRenderTargetDesc = g_stIBLLutRTA.m_pITextureRTA->GetDesc();
+
+ g_stD3DDevice.m_pID3D12Device4->GetCopyableFootprints(&stRenderTargetDesc
+ , 0, 1, 0, nullptr, nullptr, nullptr, &n64ResBufferSize);
+
+ stDownloadResDesc.Width = n64ResBufferSize;
+
+ // 后面的纹理需要将渲染的结果复制出来,必要的话需要存储至指定的文件,所以先变成Read Back堆
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_READBACK;
+ // Download Heap == Upload Heap 都是共享内存!
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &stDownloadResDesc,
+ D3D12_RESOURCE_STATE_COPY_DEST,
+ nullptr,
+ IID_PPV_ARGS(&g_stIBLLutRTA.m_pITextureRTADownload)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLLutRTA.m_pITextureRTADownload);
+
+ // 还原为上传堆属性,后续还需要用
+ g_stUploadHeapProps.Type = D3D12_HEAP_TYPE_UPLOAD;
+
+ }
+
+ // 5-3-3、创建 BRDF积分贴图 渲染需要的 Quad 数据
+ {
+ ST_GRS_VERTEX_QUAD_SIMPLE stLUTQuadData[] = {
+ { { -1.0f , -1.0f , 0.0f, 1.0f }, { 0.0f, 1.0f } }, // Bottom left.
+ { { -1.0f , 1.0f , 0.0f, 1.0f }, { 0.0f, 0.0f } }, // Top left.
+ { { 1.0f , -1.0f , 0.0f, 1.0f }, { 1.0f, 1.0f } }, // Bottom right.
+ { { 1.0f , 1.0f , 0.0f, 1.0f }, { 1.0f, 0.0f } }, // Top right.
+ };
+
+ g_stIBLLutData.m_nVertexCount = _countof(stLUTQuadData);
+
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(stLUTQuadData), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stIBLLutData.m_pIVertexBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLLutData.m_pIVertexBuffer);
+
+ UINT8* pBufferData = nullptr;
+ GRS_THROW_IF_FAILED(g_stIBLLutData.m_pIVertexBuffer->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, stLUTQuadData, sizeof(stLUTQuadData));
+ g_stIBLLutData.m_pIVertexBuffer->Unmap(0, nullptr);
+
+ g_stIBLLutData.m_stVertexBufferView.BufferLocation = g_stIBLLutData.m_pIVertexBuffer->GetGPUVirtualAddress();
+ g_stIBLLutData.m_stVertexBufferView.StrideInBytes = sizeof(ST_GRS_VERTEX_QUAD_SIMPLE);
+ g_stIBLLutData.m_stVertexBufferView.SizeInBytes = sizeof(stLUTQuadData);
+ }
+
+ // 5-3-4、渲染生成LUT
+ {
+ D3D12_RESOURCE_BARRIER stSubResBarrier = {};
+
+ stSubResBarrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ stSubResBarrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ stSubResBarrier.Transition.pResource = g_stIBLLutRTA.m_pITextureRTA.Get();
+ stSubResBarrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ stSubResBarrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+ stSubResBarrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stIBLLutRTA.m_pIRTAHeap->GetCPUDescriptorHandleForHeapStart();
+
+ // 等待前面的命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+
+ // 开始执行渲染
+ // 命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ g_stD3DDevice.m_pIMainCMDList->RSSetViewports(1, &g_stIBLLutRTA.m_stViewPort);
+ g_stD3DDevice.m_pIMainCMDList->RSSetScissorRects(1, &g_stIBLLutRTA.m_stScissorRect);
+
+ g_stD3DDevice.m_pIMainCMDList->OMSetRenderTargets(1, &stRTVHandle, FALSE, nullptr);
+
+ // 继续记录命令,并真正开始渲染
+ g_stD3DDevice.m_pIMainCMDList->ClearRenderTargetView(stRTVHandle, g_stD3DDevice.m_faClearColor, 0, nullptr);
+ //-----------------------------------------------------------------------------------------------------
+ // Draw Call !
+ //-----------------------------------------------------------------------------------------------------
+ // 渲染 Quad
+ // 设置渲染管线状态对象
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootSignature(g_stIBLLutPSO.m_pIRS.Get());
+ g_stD3DDevice.m_pIMainCMDList->SetPipelineState(g_stIBLLutPSO.m_pIPSO.Get());
+
+ // 渲染手法:三角形带
+ g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ // 设置网格信息
+ g_stD3DDevice.m_pIMainCMDList->IASetVertexBuffers(0, 1, &g_stIBLLutData.m_stVertexBufferView);
+ // Draw Call
+ g_stD3DDevice.m_pIMainCMDList->DrawInstanced(g_stIBLLutData.m_nVertexCount, 1, 0, 0);
+
+ //-----------------------------------------------------------------------------------------------------
+ // 使用资源屏障切换下状态,实际是与后面要使用这几个渲染目标的过程进行同步
+ //资源屏障,用于确定渲染已经结束可以提交画面去显示了
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &stSubResBarrier);
+
+ //关闭命令列表,可以去执行了
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+
+ }
+ //--------------------------------------------------------------------
+
+ //--------------------------------------------------------------------
+ // PBR IBL Render Resource 、Data 、Multi-Instance
+ //--------------------------------------------------------------------
+
+ // 6-1-1、创建 PBR IBL Render PSO
+ {
+ g_stIBLPSO.m_nCBVCnt = 6;
+ g_stIBLPSO.m_nSRVCnt = 3 + 6;
+ g_stIBLPSO.m_nSmpCnt = 1;
+ g_stIBLPSO.m_nCnt = g_stIBLPSO.m_nCBVCnt + g_stIBLPSO.m_nSRVCnt;
+
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[4] = {};
+ // 最后的渲染合成需要 所有的6个 常量缓冲区
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = g_stIBLPSO.m_nCBVCnt;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ // 3 Texture ( 两个预积分 Texture + 1 LUT Texture )
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = 3;
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0; // register space 0
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ // 6 Texture (6个 PBR 材质纹理)
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[2].NumDescriptors = 6;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 1; // register space 1
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ // 1 Sampler ( Linear Sampler )
+ stDSPRanges[3].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[3].NumDescriptors = g_stIBLPSO.m_nSmpCnt;
+ stDSPRanges[3].BaseShaderRegister = 0;
+ stDSPRanges[3].RegisterSpace = 0;
+ stDSPRanges[3].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[3].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[4] = {};
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//CBV是所有Shader可见
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;//SRV仅PS可见
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//SRV仅PS可见
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ stRootParameters[3].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[3].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;//SAMPLE仅PS可见
+ stRootParameters[3].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[3].DescriptorTable.pDescriptorRanges = &stDSPRanges[3];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stIBLPSO.m_pIRS)));
+
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLPSO.m_pIRS);
+ //--------------------------------------------------------------------------------------------------------------------------------
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ //编译为行矩阵形式
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+
+ ComPtr pIVSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\4-1 GRS_PBR_IBL_VS_Multi_Instance.hlsl")
+ , g_pszShaderPath);
+
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_1", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ ::StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\4-2 GRS_PBR_IBL_PS_Texture.hlsl")
+ , g_pszShaderPath);
+
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_1", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构
+ // 因为要使用 Assimp 的能力,所以顶点的数据要多插槽传入
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ // 前三个是每顶点数据从3个插槽传入
+ { "POSITION",0, DXGI_FORMAT_R32G32B32A32_FLOAT,0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ { "NORMAL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT,1, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ { "TEXCOORD",0, DXGI_FORMAT_R32G32_FLOAT, 2, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+
+ stPSODesc.pRootSignature = g_stIBLPSO.m_pIRS.Get();
+
+ // VS -> PS
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_stD3DDevice.m_emRenderTargetFormat; // 这个最终渲染到屏幕上
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+
+ stPSODesc.DSVFormat = g_stD3DDevice.m_emDepthStencilFormat;
+ stPSODesc.DepthStencilState.DepthEnable = TRUE;
+ stPSODesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;//启用深度缓存写入功能
+ stPSODesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_LESS; //深度测试函数(该值为普通的深度测试)
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc
+ , IID_PPV_ARGS(&g_stIBLPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLPSO.m_pIPSO);
+ }
+
+ {}
+ // 6-1-2 创建 Sample Heap & Sample
+ {
+ // 创建 Sample Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSamplerHeapDesc = {};
+ stSamplerHeapDesc.NumDescriptors = g_stIBLPSO.m_nSmpCnt; // 1 Sample
+ stSamplerHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
+ stSamplerHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSamplerHeapDesc
+ , IID_PPV_ARGS(&g_stIBLHeap.m_pISAPHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLHeap.m_pISAPHeap);
+ // 创建一个线性过滤的边缘裁切的采样器
+ D3D12_SAMPLER_DESC stSamplerDesc = {};
+ stSamplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
+ stSamplerDesc.MinLOD = 0;
+ stSamplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
+ stSamplerDesc.MipLODBias = 0.0f;
+ stSamplerDesc.MaxAnisotropy = 1;
+ stSamplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+ stSamplerDesc.BorderColor[0] = 0.0f;
+ stSamplerDesc.BorderColor[1] = 0.0f;
+ stSamplerDesc.BorderColor[2] = 0.0f;
+ stSamplerDesc.BorderColor[3] = 0.0f;
+ stSamplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ stSamplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateSampler(&stSamplerDesc
+ , g_stIBLHeap.m_pISAPHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+
+ {}
+ // 6-1-3、加载 PBR Material Texture & Descriptor Heap & CBV、SRV
+ {
+ g_arPBRMaterial.SetCount(5);
+ size_t szIndex = 0;
+
+ // 设置 PBR 材质纹理的相关完整路径名
+ {
+ TCHAR pszMaterialPath[MAX_PATH] = {};
+ ::StringCchPrintf(pszMaterialPath
+ , MAX_PATH
+ , _T("%sAssets\\PBR6PIC")
+ , g_pszAppPath
+ );
+
+ // Material 1 : copper rock
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAlbedo
+ , MAX_PATH
+ , _T("%s\\1-copper-rock1\\copper-rock1-alb.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszDisplacement
+ , MAX_PATH
+ , _T("%s\\1-copper-rock1\\copper-rock1-height.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszNormal
+ , MAX_PATH
+ , _T("%s\\1-copper-rock1\\copper-rock1-normal.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszMetallic
+ , MAX_PATH
+ , _T("%s\\1-copper-rock1\\copper-rock1-metal.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszRoughness
+ , MAX_PATH
+ , _T("%s\\1-copper-rock1\\copper-rock1-rough.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAO
+ , MAX_PATH
+ , _T("%s\\1-copper-rock1\\copper-rock1-ao.png")
+ , pszMaterialPath
+ );
+
+ ++szIndex;
+ // Material 2 : copper rock
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAlbedo
+ , MAX_PATH
+ , _T("%s\\2-fancy-brass-pattern1\\fancy-brass-pattern1_albedo.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszDisplacement
+ , MAX_PATH
+ , _T("%s\\2-fancy-brass-pattern1\\fancy-brass-pattern1_height.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszNormal
+ , MAX_PATH
+ , _T("%s\\2-fancy-brass-pattern1\\fancy-brass-pattern1_normal-ogl.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszMetallic
+ , MAX_PATH
+ , _T("%s\\2-fancy-brass-pattern1\\fancy-brass-pattern1_metallic.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszRoughness
+ , MAX_PATH
+ , _T("%s\\2-fancy-brass-pattern1\\fancy-brass-pattern1_roughness.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAO
+ , MAX_PATH
+ , _T("%s\\2-fancy-brass-pattern1\\fancy-brass-pattern1_ao.png")
+ , pszMaterialPath
+ );
+
+ ++szIndex;
+ // Material 3 : metal ventilation
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAlbedo
+ , MAX_PATH
+ , _T("%s\\3-metal-ventilation1\\metal-ventilation1-albedo.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszDisplacement
+ , MAX_PATH
+ , _T("%s\\3-metal-ventilation1\\metal-ventilation1-height.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszNormal
+ , MAX_PATH
+ , _T("%s\\3-metal-ventilation1\\metal-ventilation1-normal-ogl.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszMetallic
+ , MAX_PATH
+ , _T("%s\\3-metal-ventilation1\\metal-ventilation1-metallic.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszRoughness
+ , MAX_PATH
+ , _T("%s\\3-metal-ventilation1\\metal-ventilation1-roughness.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAO
+ , MAX_PATH
+ , _T("%s\\3-metal-ventilation1\\metal-ventilation1-ao.png")
+ , pszMaterialPath
+ );
+
+ ++szIndex;
+ // Material 4 : pirate gold
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAlbedo
+ , MAX_PATH
+ , _T("%s\\4-pirate-gold\\pirate-gold_albedo.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszDisplacement
+ , MAX_PATH
+ , _T("%s\\4-pirate-gold\\pirate-gold_height.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszNormal
+ , MAX_PATH
+ , _T("%s\\4-pirate-gold\\pirate-gold_normal-ogl.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszMetallic
+ , MAX_PATH
+ , _T("%s\\4-pirate-gold\\pirate-gold_metallic.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszRoughness
+ , MAX_PATH
+ , _T("%s\\4-pirate-gold\\pirate-gold_roughness.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAO
+ , MAX_PATH
+ , _T("%s\\4-pirate-gold\\pirate-gold_ao.png")
+ , pszMaterialPath
+ );
+
+ ++szIndex;
+ // Material 5 : ribbed chipped metal
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAlbedo
+ , MAX_PATH
+ , _T("%s\\5-ribbed-chipped-metal\\ribbed-chipped-metal_albedo.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszDisplacement
+ , MAX_PATH
+ , _T("%s\\5-ribbed-chipped-metal\\ribbed-chipped-metal_height.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszNormal
+ , MAX_PATH
+ , _T("%s\\5-ribbed-chipped-metal\\ribbed-chipped-metal_normal-ogl.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszMetallic
+ , MAX_PATH
+ , _T("%s\\5-ribbed-chipped-metal\\ribbed-chipped-metal_metallic.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszRoughness
+ , MAX_PATH
+ , _T("%s\\5-ribbed-chipped-metal\\ribbed-chipped-metal_roughness.png")
+ , pszMaterialPath
+ );
+ ::StringCchPrintf(g_arPBRMaterial[szIndex].m_pszAO
+ , MAX_PATH
+ , _T("%s\\5-ribbed-chipped-metal\\ribbed-chipped-metal_ao.png")
+ , pszMaterialPath
+ );
+ }
+
+ // 提示:以上的代码可以放到脚本里面,因为这里是演示教程而已,就没有引入这些啰嗦的东西了,只是简单的罗列
+ ID3D12Resource* pITexture = nullptr;
+ ID3D12Resource* pITextureUpload = nullptr;
+
+ // 创建 CBV SRV Heap
+ D3D12_DESCRIPTOR_HEAP_DESC stSRVHeapDesc = {};
+ stSRVHeapDesc.NumDescriptors = g_stIBLPSO.m_nCnt;
+ stSRVHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+ stSRVHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ D3D12_CPU_DESCRIPTOR_HANDLE stCBVSRVHandle = {};
+
+ D3D12_RESOURCE_DESC stResDesc = {};
+ D3D12_SHADER_RESOURCE_VIEW_DESC stSRVDesc = {};
+ D3D12_CONSTANT_BUFFER_VIEW_DESC stCBVDesc = {};
+
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+
+ // 等待前面的命令执行结束
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ ::AtlThrowLastWin32();
+ }
+ // 命令分配器先Reset一下 , 因为后面有新的资源要上传到显存,需要使用命令队列
+ // 一般情况下最好专门创建一个复制命令队列来执行这些资源上传的工作,示例程序中对这些都做了简化
+ // 具体的复制命令队列的用法之前的例子中都有,可以去参考
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ for (szIndex = 0; szIndex < g_arPBRMaterial.GetCount(); ++szIndex)
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSRVHeapDesc
+ , IID_PPV_ARGS(&g_arPBRMaterial[szIndex].m_pIMaterialHeap)));
+
+ GRS_SetD3D12DebugNameIndexed(g_arPBRMaterial[szIndex].m_pIMaterialHeap.Get()
+ , L"g_arPBRMaterial.m_pIMaterialHeap"
+ , (UINT)szIndex);
+
+ // 创建每个 Model 的 Const Buffer
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_MODEL_DATA), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_arPBRMaterial[szIndex].m_pICBModelData)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_arPBRMaterial[szIndex].m_pICBModelData);
+ // 映射出常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_arPBRMaterial[szIndex].m_pICBModelData->Map(0
+ , nullptr
+ , reinterpret_cast(&g_arPBRMaterial[szIndex].m_pstModelData)));
+
+ stCBVSRVHandle
+ = g_arPBRMaterial[szIndex].m_pIMaterialHeap->GetCPUDescriptorHandleForHeapStart();
+
+ D3D12_CONSTANT_BUFFER_VIEW_DESC stCBVDesc = {};
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ //1、Scene Matrix
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVSRVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pIGSMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_GS_VIEW_MATRIX)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //2、GS Views
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVSRVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneCameraBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_SCENE_CAMERA)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //3、Camera
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVSRVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pISceneLightsBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_SCENE_LIGHTS)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ //4、Lights
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVSRVHandle);
+
+ stCBVDesc.BufferLocation = g_stWorldConstData.m_pIPBRMaterialBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_PBR_MATERIAL)
+ , D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+
+ //5、PBR Material
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVSRVHandle);
+
+ stCBVDesc.BufferLocation = g_arPBRMaterial[szIndex].m_pICBModelData->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)g_arPBRMaterial[szIndex].m_pICBModelData->GetDesc().Width;
+ //跳过一个现在还不创建的CBV,之后直接复制进去
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+
+ // 6、Model Data
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, stCBVSRVHandle);
+
+ // 创建 SRV
+ stResDesc = g_stIBLSpecularPreIntRTA.m_pITextureRTA->GetDesc();
+
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = stResDesc.Format;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
+ stSRVDesc.TextureCube.MipLevels = stResDesc.MipLevels;
+
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ // 1、Specular Pre Int Texture Srv
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_stIBLSpecularPreIntRTA.m_pITextureRTA.Get(), &stSRVDesc, stCBVSRVHandle);
+
+ stResDesc = g_stIBLDiffusePreIntRTA.m_pITextureRTA->GetDesc();
+
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = stResDesc.Format;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;
+ stSRVDesc.TextureCube.MipLevels = stResDesc.MipLevels;
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ // 2、Diffuse Pre Int Texture Srv
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_stIBLDiffusePreIntRTA.m_pITextureRTA.Get(), &stSRVDesc, stCBVSRVHandle);
+
+ stResDesc = g_stIBLLutRTA.m_pITextureRTA->GetDesc();
+
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ stSRVDesc.Format = stResDesc.Format;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
+ stSRVDesc.Texture2D.MipLevels = stResDesc.MipLevels;
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ // 3、BRDF LUT Texture Srv
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_stIBLLutRTA.m_pITextureRTA.Get(), &stSRVDesc, stCBVSRVHandle);
+
+ // 顺序加载 PBR 的材质纹理
+ for (size_t szTxNo = 0; szTxNo < GRS_PBR_MATERIAL_TEXTURE_CNT; ++szTxNo)
+ {
+ if (!LoadTextureFromFile(g_arPBRMaterial[szIndex].m_pszPBRMaterialPathName[szTxNo]
+ , g_stD3DDevice.m_pIMainCMDList.Get()
+ , pITextureUpload
+ , pITexture))
+ {
+ AtlThrowLastWin32();
+ }
+
+ g_arPBRMaterial[szIndex].m_arTexMaterial.Add(ComPtr(pITexture));
+ g_arPBRMaterial[szIndex].m_arTexMaterialUpload.Add(ComPtr(pITextureUpload));
+
+ stResDesc = g_arPBRMaterial[szIndex].m_arTexMaterial[szTxNo]->GetDesc();
+
+ stSRVDesc.Format = stResDesc.Format;
+ stSRVDesc.TextureCube.MipLevels = stResDesc.MipLevels;
+
+ stCBVSRVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(
+ g_arPBRMaterial[szIndex].m_arTexMaterial[szTxNo].Get()
+ , &stSRVDesc
+ , stCBVSRVHandle);
+ }
+ }
+
+ // 关闭命令列表,可以去执行了
+ // 就是上传之前这一堆PBR材质资源到显存中,这对显卡的显存量是个挑战
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+ //执行命令列表
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ g_stD3DDevice.m_n64FenceValue++;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+ }
+
+ {}
+ // 6-1-4、加载网格数据
+ {
+ TCHAR pszMeshFile[MAX_PATH] = {};
+ StringCchPrintf(pszMeshFile, MAX_PATH, _T("%sAssets\\The3DModel\\sphere.x"), g_pszAppPath);
+#ifdef GRS_USE_DIR_DIALOG
+ OPENFILENAME stOfn = {};
+
+ RtlZeroMemory(&stOfn, sizeof(stOfn));
+ stOfn.lStructSize = sizeof(stOfn);
+ stOfn.hwndOwner = ::GetDesktopWindow(); //g_stD3DDevice.m_hWnd;
+ stOfn.lpstrFilter = _T("x文件\0*.x\0obj文件\0*.obj\0所有文件\0*.*\0");
+ stOfn.lpstrFile = pszMeshFile;
+ stOfn.nMaxFile = MAX_PATH;
+ stOfn.lpstrTitle = _T("请选择一个 Mesh 文件...");
+ stOfn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;
+
+ if (!::GetOpenFileName(&stOfn))
+ {
+ StringCchPrintf(pszMeshFile, MAX_PATH, _T("%sAssets\\misc\\sphere.x"), g_pszAppPath);
+ }
+#endif
+
+ ST_GRS_MESH_DATA stMeshData = {};
+ if (!LoadMesh(T2A(pszMeshFile), stMeshData))
+ {
+ ::AtlThrowLastWin32();
+ }
+
+ // Vertex Data
+ size_t szPositions
+ = stMeshData.m_arPositions.GetCount()
+ * sizeof(stMeshData.m_arPositions[0]);
+ size_t szNormals
+ = stMeshData.m_arNormals.GetCount()
+ * sizeof(stMeshData.m_arNormals[0]);
+ size_t szTexCoords
+ = stMeshData.m_arTexCoords.GetCount()
+ * sizeof(stMeshData.m_arTexCoords[0]);
+
+ // Index Data
+ size_t szIndices
+ = stMeshData.m_arIndices.GetCount()
+ * sizeof(stMeshData.m_arIndices[0]);
+
+ g_stMultiMeshData.m_nIndexCount = (UINT)stMeshData.m_arIndices.GetCount();
+ if (2 == sizeof(stMeshData.m_arIndices[0]))
+ {// UINT16 型索引
+ g_stMultiMeshData.m_emIndexType = DXGI_FORMAT_R16_UINT;
+ }
+ else
+ {// 其它统统认为是 UINT32 型索引,不用担心,Assimp库帮我们保证
+ g_stMultiMeshData.m_emIndexType = DXGI_FORMAT_R32_UINT;
+ }
+
+ UINT nSlot = 0;
+ ComPtr pIBuffer;
+ //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+ // Slot 0 Positions
+ g_stBufferResSesc.Width = szPositions;
+ //创建 Vertex Buffer 仅使用Upload隐式堆
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&pIBuffer)));
+ g_stMultiMeshData.m_arIVB.Add(pIBuffer);
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stMultiMeshData.m_arIVB, nSlot);
+
+ //使用map-memcpy-unmap大法将数据传至顶点缓冲对象
+ UINT8* pData = nullptr;
+
+ GRS_THROW_IF_FAILED(g_stMultiMeshData.m_arIVB[nSlot]->Map(0, nullptr, reinterpret_cast(&pData)));
+ memcpy(pData, stMeshData.m_arPositions.GetData(), szPositions);
+ g_stMultiMeshData.m_arIVB[nSlot]->Unmap(0, nullptr);
+
+ D3D12_VERTEX_BUFFER_VIEW stVBV = {};
+ //创建Vertex Buffer View
+ stVBV.BufferLocation = g_stMultiMeshData.m_arIVB[nSlot]->GetGPUVirtualAddress();
+ stVBV.StrideInBytes = sizeof(stMeshData.m_arPositions[0]);
+ stVBV.SizeInBytes = (UINT)szPositions;
+
+ g_stMultiMeshData.m_arVBV.Add(stVBV);
+ //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+ //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+ // Slot 1 Normals
+ nSlot = 1;
+ g_stBufferResSesc.Width = szNormals;
+ //创建 Vertex Buffer 仅使用Upload隐式堆
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&pIBuffer)));
+ g_stMultiMeshData.m_arIVB.Add(pIBuffer);
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stMultiMeshData.m_arIVB, nSlot);
+
+ //使用map-memcpy-unmap大法将数据传至顶点缓冲对象
+ pData = nullptr;
+
+ GRS_THROW_IF_FAILED(g_stMultiMeshData.m_arIVB[nSlot]->Map(0, nullptr, reinterpret_cast(&pData)));
+ memcpy(pData, stMeshData.m_arNormals.GetData(), szNormals);
+ g_stMultiMeshData.m_arIVB[nSlot]->Unmap(0, nullptr);
+
+ //创建Vertex Buffer View
+ stVBV.BufferLocation = g_stMultiMeshData.m_arIVB[nSlot]->GetGPUVirtualAddress();
+ stVBV.StrideInBytes = sizeof(stMeshData.m_arNormals[0]);
+ stVBV.SizeInBytes = (UINT)szNormals;
+
+ g_stMultiMeshData.m_arVBV.Add(stVBV);
+
+ //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+ // Slot 2 Texture Coords
+ nSlot = 2;
+ g_stBufferResSesc.Width = szTexCoords;
+ //创建 Vertex Buffer 仅使用Upload隐式堆
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&pIBuffer)));
+ g_stMultiMeshData.m_arIVB.Add(pIBuffer);
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stMultiMeshData.m_arIVB, nSlot);
+
+ //使用map-memcpy-unmap大法将数据传至顶点缓冲对象
+ pData = nullptr;
+
+ GRS_THROW_IF_FAILED(g_stMultiMeshData.m_arIVB[nSlot]->Map(0, nullptr, reinterpret_cast(&pData)));
+ memcpy(pData, stMeshData.m_arTexCoords.GetData(), szTexCoords);
+ g_stMultiMeshData.m_arIVB[nSlot]->Unmap(0, nullptr);
+
+ //创建Vertex Buffer View
+ stVBV.BufferLocation = g_stMultiMeshData.m_arIVB[nSlot]->GetGPUVirtualAddress();
+ stVBV.StrideInBytes = sizeof(stMeshData.m_arTexCoords[0]);
+ stVBV.SizeInBytes = (UINT)szTexCoords;
+ g_stMultiMeshData.m_arVBV.Add(stVBV);
+ //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
+
+ // Index Buffer 有单独的专门通道 不用占用 Slot
+ //创建 Index Buffer 仅使用Upload隐式堆
+ g_stBufferResSesc.Width = szIndices;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stMultiMeshData.m_pIIB)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stMultiMeshData.m_pIIB);
+
+ pData = nullptr;
+ GRS_THROW_IF_FAILED(g_stMultiMeshData.m_pIIB->Map(0, nullptr, reinterpret_cast(&pData)));
+ memcpy(pData, stMeshData.m_arIndices.GetData(), szIndices);
+ g_stMultiMeshData.m_pIIB->Unmap(0, nullptr);
+
+ //创建Index Buffer View
+ g_stMultiMeshData.m_stIBV.BufferLocation = g_stMultiMeshData.m_pIIB->GetGPUVirtualAddress();
+ g_stMultiMeshData.m_stIBV.Format = DXGI_FORMAT_R32_UINT;
+ g_stMultiMeshData.m_stIBV.SizeInBytes = g_stMultiMeshData.m_nIndexCount * sizeof(UINT);
+ }
+
+ // 6-1-5、创建PBR渲染的捆绑包
+ {}
+ {
+ //GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_BUNDLE
+ // , IID_PPV_ARGS(&g_stIBLPSO.m_pICmdAlloc)));
+ //GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLPSO.m_pICmdAlloc);
+
+ //GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_BUNDLE
+ // , g_stIBLPSO.m_pICmdAlloc.Get(), nullptr, IID_PPV_ARGS(&g_stIBLPSO.m_pICmdBundles)));
+ //GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stIBLPSO.m_pICmdBundles);
+
+ //g_stIBLPSO.m_pICmdBundles->SetGraphicsRootSignature(g_stIBLPSO.m_pIRS.Get());
+ //g_stIBLPSO.m_pICmdBundles->SetPipelineState(g_stIBLPSO.m_pIPSO.Get());
+
+ //// 复制描述符
+ //D3D12_CPU_DESCRIPTOR_HANDLE stDestHandle
+ // = g_stIBLHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ //
+ //stDestHandle.ptr += ((g_stIBLPSO.m_nCBVCnt - 1) * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+
+ //D3D12_CPU_DESCRIPTOR_HANDLE stSrcHandle
+ // = g_arPBRMaterial[0].m_pIMaterialHeap->GetCPUDescriptorHandleForHeapStart();
+
+ //UINT nDesRangeSizes = GRS_MODEL_DATA_CB_CNT;
+ //UINT nSrcRangeSizes = GRS_MODEL_DATA_CB_CNT;
+ //// Copy 1 CBV
+ //g_stD3DDevice.m_pID3D12Device4->CopyDescriptors(
+ // 1
+ // , &stDestHandle
+ // , &nDesRangeSizes
+ // , 1
+ // , &stSrcHandle
+ // , &nSrcRangeSizes
+ // , D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+
+ //stDestHandle.ptr += ((1 + 3) * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+
+ //stSrcHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+
+ //nDesRangeSizes = GRS_PBR_MATERIAL_TEXTURE_CNT;
+ //nSrcRangeSizes = GRS_PBR_MATERIAL_TEXTURE_CNT;
+
+ //// Copy 6 SRV
+ //g_stD3DDevice.m_pID3D12Device4->CopyDescriptors(
+ // 1
+ // , &stDestHandle
+ // , &nDesRangeSizes
+ // , 1
+ // , &stSrcHandle
+ // , &nSrcRangeSizes
+ // , D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+
+ //arHeaps.RemoveAll();
+ //arHeaps.Add(g_stIBLHeap.m_pICBVSRVHeap.Get());
+ //arHeaps.Add(g_stIBLHeap.m_pISAPHeap.Get());
+
+ //g_stIBLPSO.m_pICmdBundles->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ //
+ //D3D12_GPU_DESCRIPTOR_HANDLE stGPUCBVHandle
+ // = g_stIBLHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ ////设置CBV
+ //g_stIBLPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(0, stGPUCBVHandle);
+
+ //// 设置SRV (space 0)
+ //stGPUCBVHandle.ptr += (g_stIBLHeap.m_nSRVOffset * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ //g_stIBLPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(1, stGPUCBVHandle);
+
+ //// 设置SRV (space 1)
+ //stGPUCBVHandle.ptr += (3 * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ //g_stIBLPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(2, stGPUCBVHandle);
+
+ //// 设置Sample
+ //g_stIBLPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(3, g_stIBLHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart());
+
+ //// 设置渲染手法
+ //g_stIBLPSO.m_pICmdBundles->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ //// 设置顶点数据
+ //g_stIBLPSO.m_pICmdBundles->IASetVertexBuffers(0
+ // , (UINT)g_stMultiMeshData.m_arVBV.GetCount()
+ // , g_stMultiMeshData.m_arVBV.GetData());
+ //g_stIBLPSO.m_pICmdBundles->IASetIndexBuffer(&g_stMultiMeshData.m_stIBV);
+ //
+ //// Draw Call!!!
+ //g_stIBLPSO.m_pICmdBundles->DrawIndexedInstanced(g_stMultiMeshData.m_nIndexCount, 1, 0, 0, 0);
+ //
+ //g_stIBLPSO.m_pICmdBundles->Close();
+ }
+
+ //--------------------------------------------------------------------
+ {}
+ // 7-0、将需要矩形框显示的纹理全部添加到矩形框纹理数组中
+ {
+ g_stQuadData.m_ppITexture.Add(g_stHDRData.m_pIHDRTextureRaw);
+ g_stQuadData.m_ppITexture.Add(g_st1TimesGSRTAStatus.m_pITextureRTA);
+ // 6遍 渲染的结果暂时先不显示了
+ //g_stQuadData.m_ppITexture.Add(g_st6TimesRTAStatus.m_pITextureRTA);
+ g_stQuadData.m_ppITexture.Add(g_stIBLDiffusePreIntRTA.m_pITextureRTA);
+ g_stQuadData.m_ppITexture.Add(g_stIBLSpecularPreIntRTA.m_pITextureRTA);
+ g_stQuadData.m_ppITexture.Add(g_stIBLLutRTA.m_pITextureRTA);
+
+ g_stQuadData.m_nInstanceCount = 0;
+ D3D12_RESOURCE_DESC stResDes = {};
+ for (size_t i = 0; i < g_stQuadData.m_ppITexture.GetCount(); i++)
+ {// 按照每个 Array MipLevels Element单独计算个数
+ stResDes = g_stQuadData.m_ppITexture[i]->GetDesc();
+ g_stQuadData.m_nInstanceCount += stResDes.DepthOrArraySize * stResDes.MipLevels;
+ }
+ }
+
+ // 7-1、创建渲染矩形用的管线的根签名和状态对象
+ {
+ //创建渲染矩形的根签名对象
+ D3D12_DESCRIPTOR_RANGE1 stDSPRanges[3] = {};
+ stDSPRanges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_CBV;
+ stDSPRanges[0].NumDescriptors = 1;
+ stDSPRanges[0].BaseShaderRegister = 0;
+ stDSPRanges[0].RegisterSpace = 0;
+ stDSPRanges[0].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE;
+ stDSPRanges[0].OffsetInDescriptorsFromTableStart = 0;
+
+ stDSPRanges[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
+ stDSPRanges[1].NumDescriptors = g_stQuadData.m_nInstanceCount; // 1 HDR Texture + 6 Render Target Texture
+ stDSPRanges[1].BaseShaderRegister = 0;
+ stDSPRanges[1].RegisterSpace = 0;
+ stDSPRanges[1].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ stDSPRanges[1].OffsetInDescriptorsFromTableStart = 0;
+
+ stDSPRanges[2].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;
+ stDSPRanges[2].NumDescriptors = 1;
+ stDSPRanges[2].BaseShaderRegister = 0;
+ stDSPRanges[2].RegisterSpace = 0;
+ stDSPRanges[2].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE;
+ stDSPRanges[2].OffsetInDescriptorsFromTableStart = 0;
+
+ D3D12_ROOT_PARAMETER1 stRootParameters[3] = {};
+ stRootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+ stRootParameters[0].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[0].DescriptorTable.pDescriptorRanges = &stDSPRanges[0];
+
+ stRootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
+ stRootParameters[1].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[1].DescriptorTable.pDescriptorRanges = &stDSPRanges[1];
+
+ stRootParameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
+ stRootParameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
+ stRootParameters[2].DescriptorTable.NumDescriptorRanges = 1;
+ stRootParameters[2].DescriptorTable.pDescriptorRanges = &stDSPRanges[2];
+
+ D3D12_VERSIONED_ROOT_SIGNATURE_DESC stRootSignatureDesc = {};
+ stRootSignatureDesc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
+ stRootSignatureDesc.Desc_1_1.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
+ stRootSignatureDesc.Desc_1_1.NumParameters = _countof(stRootParameters);
+ stRootSignatureDesc.Desc_1_1.pParameters = stRootParameters;
+ stRootSignatureDesc.Desc_1_1.NumStaticSamplers = 0;
+ stRootSignatureDesc.Desc_1_1.pStaticSamplers = nullptr;
+
+ ComPtr pISignatureBlob;
+ ComPtr pIErrorBlob;
+
+ GRS_THROW_IF_FAILED(D3D12SerializeVersionedRootSignature(&stRootSignatureDesc
+ , &pISignatureBlob
+ , &pIErrorBlob));
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateRootSignature(0
+ , pISignatureBlob->GetBufferPointer()
+ , pISignatureBlob->GetBufferSize()
+ , IID_PPV_ARGS(&g_stQuadPSO.m_pIRS)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadPSO.m_pIRS);
+
+ UINT nCompileFlags = 0;
+#if defined(_DEBUG)
+ // Enable better shader debugging with the graphics debugging tools.
+ nCompileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
+#endif
+ nCompileFlags |= D3DCOMPILE_PACK_MATRIX_ROW_MAJOR;
+
+ TCHAR pszShaderFileName[MAX_PATH] = {};
+ StringCchPrintf(pszShaderFileName
+ , MAX_PATH
+ , _T("%s\\6-1 GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl")
+ , g_pszShaderPath);
+
+ ComPtr pIVSCode;
+ ComPtr pIPSCode;
+ ComPtr pIErrorMsg;
+
+ // VS
+ HRESULT hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "VSMain", "vs_5_1", nCompileFlags, 0, &pIVSCode, &pIErrorMsg);
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Vertex Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+ // 下面的开关允许打开动态纹理数组索引
+ nCompileFlags |= D3DCOMPILE_ENABLE_UNBOUNDED_DESCRIPTOR_TABLES;
+ hr = D3DCompileFromFile(pszShaderFileName, nullptr, &grsD3DCompilerInclude
+ , "PSMain", "ps_5_1", nCompileFlags, 0, &pIPSCode, &pIErrorMsg);
+
+ if (FAILED(hr))
+ {
+ ATLTRACE("编译 Pixel Shader:\"%s\" 发生错误:%s\n"
+ , T2A(pszShaderFileName)
+ , pIErrorMsg ? pIErrorMsg->GetBufferPointer() : "无法读取文件!");
+ GRS_THROW_IF_FAILED(hr);
+ }
+ pIErrorMsg.Reset();
+
+ // 定义输入顶点的数据结构,注意这里带有多实例的数据
+ D3D12_INPUT_ELEMENT_DESC stInputElementDescs[] =
+ {
+ { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+ { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 32, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
+
+ { "WORLD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1 },
+ { "WORLD", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1 },
+ { "WORLD", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1 },
+ { "WORLD", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1 },
+ { "COLOR", 1, DXGI_FORMAT_R32_UINT, 1, 64, D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA, 1 },
+ };
+
+ // 创建 graphics pipeline state object (PSO)对象
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC stPSODesc = {};
+ stPSODesc.InputLayout = { stInputElementDescs, _countof(stInputElementDescs) };
+ stPSODesc.pRootSignature = g_stQuadPSO.m_pIRS.Get();
+
+ stPSODesc.VS.BytecodeLength = pIVSCode->GetBufferSize();
+ stPSODesc.VS.pShaderBytecode = pIVSCode->GetBufferPointer();
+ stPSODesc.PS.BytecodeLength = pIPSCode->GetBufferSize();
+ stPSODesc.PS.pShaderBytecode = pIPSCode->GetBufferPointer();
+
+ stPSODesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
+ stPSODesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
+
+ stPSODesc.BlendState.AlphaToCoverageEnable = FALSE;
+ stPSODesc.BlendState.IndependentBlendEnable = FALSE;
+ stPSODesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
+
+ stPSODesc.DepthStencilState.DepthEnable = FALSE;
+ stPSODesc.DepthStencilState.StencilEnable = FALSE;
+
+ stPSODesc.SampleMask = UINT_MAX;
+ stPSODesc.SampleDesc.Count = 1;
+
+ stPSODesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
+
+ stPSODesc.NumRenderTargets = 1;
+ stPSODesc.RTVFormats[0] = g_stD3DDevice.m_emRenderTargetFormat;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateGraphicsPipelineState(&stPSODesc
+ , IID_PPV_ARGS(&g_stQuadPSO.m_pIPSO)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadPSO.m_pIPSO);
+
+ // 创建矩形框渲染需要的SRV CBV Sample等
+ D3D12_DESCRIPTOR_HEAP_DESC stHeapDesc = {};
+ stHeapDesc.NumDescriptors = 1 + g_stQuadData.m_nInstanceCount; // 1 CBV + n SRV
+ stHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
+ stHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ //CBV SRV堆
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stHeapDesc
+ , IID_PPV_ARGS(&g_stQuadHeap.m_pICBVSRVHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadHeap.m_pICBVSRVHeap);
+
+ //Sample
+ D3D12_DESCRIPTOR_HEAP_DESC stSamplerHeapDesc = {};
+ stSamplerHeapDesc.NumDescriptors = 1; //只有一个Sample
+ stSamplerHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;
+ stSamplerHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateDescriptorHeap(&stSamplerHeapDesc
+ , IID_PPV_ARGS(&g_stQuadHeap.m_pISAPHeap)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadHeap.m_pISAPHeap);
+
+ // Sample View
+ D3D12_SAMPLER_DESC stSamplerDesc = {};
+ stSamplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
+ stSamplerDesc.MinLOD = 0;
+ stSamplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
+ stSamplerDesc.MipLODBias = 0.0f;
+ stSamplerDesc.MaxAnisotropy = 1;
+ stSamplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;
+ stSamplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
+ stSamplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
+ stSamplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateSampler(&stSamplerDesc
+ , g_stQuadHeap.m_pISAPHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+ {}
+ // 7-2、创建矩形框的顶点缓冲
+ {
+ //矩形框的顶点结构变量
+ //注意这里定义了一个单位大小的正方形,后面通过缩放和位移矩阵变换到合适的大小,这个技术常用于Spirit、UI等2D渲染
+ // 注意这里顶点的w坐标,必须设定为1.0f,否则缩放时其尺寸不再是像素大小,而是缩放尺寸 * 1/w ,所以当w小于1时等于又放大了一个尺寸
+ ST_GRS_VERTEX_QUAD stTriangleVertices[] =
+ {
+ { { 0.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f } },
+ { { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 0.0f } },
+ { { 0.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f } },
+ { { 1.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 1.0f, 1.0f }, { 1.0f, 1.0f } }
+ };
+
+ g_stQuadData.m_nVertexCount = _countof(stTriangleVertices);
+
+ UINT nSlotIndex = 0;
+ // Slot 0
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(stTriangleVertices), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stQuadData.m_ppIVertexBuffer[nSlotIndex])));
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stQuadData.m_ppIVertexBuffer, nSlotIndex);
+
+ UINT8* pBufferData = nullptr;
+ GRS_THROW_IF_FAILED(g_stQuadData.m_ppIVertexBuffer[nSlotIndex]->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, stTriangleVertices, sizeof(stTriangleVertices));
+ g_stQuadData.m_ppIVertexBuffer[nSlotIndex]->Unmap(0, nullptr);
+
+ g_stQuadData.m_pstVertexBufferView[nSlotIndex].BufferLocation = g_stQuadData.m_ppIVertexBuffer[nSlotIndex]->GetGPUVirtualAddress();
+ g_stQuadData.m_pstVertexBufferView[nSlotIndex].StrideInBytes = sizeof(ST_GRS_VERTEX_QUAD);
+ g_stQuadData.m_pstVertexBufferView[nSlotIndex].SizeInBytes = sizeof(stTriangleVertices);
+
+ // Slot 1
+ nSlotIndex = 1;
+ UINT szSlot1Buffer = g_stQuadData.m_nInstanceCount * sizeof(ST_GRS_PER_QUAD_INSTANCE_DATA);
+ g_stBufferResSesc.Width = GRS_UPPER(szSlot1Buffer, D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &g_stBufferResSesc
+ , D3D12_RESOURCE_STATE_GENERIC_READ
+ , nullptr
+ , IID_PPV_ARGS(&g_stQuadData.m_ppIVertexBuffer[nSlotIndex])));
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stQuadData.m_ppIVertexBuffer, nSlotIndex);
+
+ ST_GRS_PER_QUAD_INSTANCE_DATA* pstQuadInstanceData = nullptr;
+ GRS_THROW_IF_FAILED(g_stQuadData.m_ppIVertexBuffer[nSlotIndex]->Map(0, nullptr, reinterpret_cast(&pstQuadInstanceData)));
+
+ float fOffsetX = 2.0f;
+ float fOffsetY = fOffsetX;
+ float fWidth = 200.f;
+ float fHeight = fWidth;
+ size_t szCol = 10;
+
+ for (size_t i = 0; i < g_stQuadData.m_nInstanceCount; i++)
+ {
+ pstQuadInstanceData[i].m_nTextureIndex = (UINT)i;
+ // 先缩放
+ pstQuadInstanceData[i].m_mxQuad2World = XMMatrixScaling(fWidth, fHeight, 1.0f);
+ // 再偏移到合适的位置
+ pstQuadInstanceData[i].m_mxQuad2World = XMMatrixMultiply(
+ pstQuadInstanceData[i].m_mxQuad2World
+ , XMMatrixTranslation(
+ (i % szCol) * (fWidth + fOffsetX) + fOffsetX
+ , (i / szCol) * (fHeight + fOffsetY) + fOffsetY
+ , 0.0f)
+ );
+ }
+
+ g_stQuadData.m_ppIVertexBuffer[nSlotIndex]->Unmap(0, nullptr);
+
+ g_stQuadData.m_pstVertexBufferView[nSlotIndex].BufferLocation
+ = g_stQuadData.m_ppIVertexBuffer[nSlotIndex]->GetGPUVirtualAddress();
+ g_stQuadData.m_pstVertexBufferView[nSlotIndex].StrideInBytes
+ = sizeof(ST_GRS_PER_QUAD_INSTANCE_DATA);
+ g_stQuadData.m_pstVertexBufferView[nSlotIndex].SizeInBytes
+ = szSlot1Buffer;
+
+ //--------------------------------------------------------------------
+ // 创建Scene Matrix 常量缓冲
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stUploadHeapProps,
+ D3D12_HEAP_FLAG_NONE,
+ &g_stBufferResSesc,
+ D3D12_RESOURCE_STATE_GENERIC_READ,
+ nullptr,
+ IID_PPV_ARGS(&g_stQuadConstData.m_pISceneMatrixBuffer)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadConstData.m_pISceneMatrixBuffer);
+ // 映射出 Scene 常量缓冲 不再 Unmap了 每次直接写入即可
+ GRS_THROW_IF_FAILED(g_stQuadConstData.m_pISceneMatrixBuffer->Map(0, nullptr, reinterpret_cast(&g_stQuadConstData.m_pstSceneMatrix)));
+
+ // 初始化正交矩阵
+ g_stQuadConstData.m_pstSceneMatrix->m_mxWorld = XMMatrixIdentity();
+ g_stQuadConstData.m_pstSceneMatrix->m_mxView = XMMatrixIdentity();
+
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj = XMMatrixScaling(1.0f, -1.0f, 1.0f); //上下翻转,配合之前的Quad的Vertex坐标一起使用
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj = XMMatrixMultiply(g_stQuadConstData.m_pstSceneMatrix->m_mxProj, XMMatrixTranslation(-0.5f, +0.5f, 0.0f)); //微量偏移,矫正像素位置
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj = XMMatrixMultiply(
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj
+ , XMMatrixOrthographicOffCenterLH(g_stD3DDevice.m_stViewPort.TopLeftX
+ , g_stD3DDevice.m_stViewPort.TopLeftX + g_stD3DDevice.m_stViewPort.Width
+ , -(g_stD3DDevice.m_stViewPort.TopLeftY + g_stD3DDevice.m_stViewPort.Height)
+ , -g_stD3DDevice.m_stViewPort.TopLeftY
+ , g_stD3DDevice.m_stViewPort.MinDepth
+ , g_stD3DDevice.m_stViewPort.MaxDepth)
+ );
+ // View * Orthographic 正交投影时,视矩阵通常是一个单位矩阵,这里之所以乘一下以表示与射影投影一致
+ g_stQuadConstData.m_pstSceneMatrix->m_mxWorldView
+ = XMMatrixMultiply(g_stQuadConstData.m_pstSceneMatrix->m_mxWorld
+ , g_stQuadConstData.m_pstSceneMatrix->m_mxView);
+ g_stQuadConstData.m_pstSceneMatrix->m_mxWVP
+ = XMMatrixMultiply(g_stQuadConstData.m_pstSceneMatrix->m_mxWorldView
+ , g_stQuadConstData.m_pstSceneMatrix->m_mxProj);
+
+ // 使用常量缓冲区创建CBV
+ D3D12_CONSTANT_BUFFER_VIEW_DESC stCBVDesc = {};
+ stCBVDesc.BufferLocation = g_stQuadConstData.m_pISceneMatrixBuffer->GetGPUVirtualAddress();
+ stCBVDesc.SizeInBytes = (UINT)GRS_UPPER(sizeof(ST_GRS_CB_SCENE_MATRIX), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ D3D12_CPU_DESCRIPTOR_HANDLE cbvSrvHandleSkybox = { g_stQuadHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart() };
+ g_stD3DDevice.m_pID3D12Device4->CreateConstantBufferView(&stCBVDesc, cbvSrvHandleSkybox);
+
+ // 使用默认的HDR纹理作为矩形框默认显示的画面先,通过按tab键切换为渲染结果纹理
+ cbvSrvHandleSkybox.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+
+ // SRV
+ D3D12_SHADER_RESOURCE_VIEW_DESC stSRVDesc = {};
+ stSRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
+ D3D12_RESOURCE_DESC stResDesc = {};
+ // 注意下面创建SRV的方式很巧妙,将Texture2DArray的每一个子资源作为一个视图,这是一种常用的技术
+ for (size_t i = 0; i < g_stQuadData.m_ppITexture.GetCount(); i++)
+ {
+ stResDesc = g_stQuadData.m_ppITexture[i]->GetDesc();
+
+ stSRVDesc.Format = stResDesc.Format;
+ stSRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
+
+ for (UINT16 nArraySlice = 0; nArraySlice < stResDesc.DepthOrArraySize; nArraySlice++)
+ {
+ for (UINT16 nMipSlice = 0; nMipSlice < stResDesc.MipLevels; nMipSlice++)
+ {
+ stSRVDesc.Texture2DArray.ArraySize = 1;
+ stSRVDesc.Texture2DArray.MipLevels = 1;
+
+ stSRVDesc.Texture2DArray.FirstArraySlice = nArraySlice;
+ stSRVDesc.Texture2DArray.MostDetailedMip = nMipSlice;
+
+ g_stD3DDevice.m_pID3D12Device4->CreateShaderResourceView(g_stQuadData.m_ppITexture[i].Get(), &stSRVDesc, cbvSrvHandleSkybox);
+
+ cbvSrvHandleSkybox.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ }
+ }
+ }
+ }
+ {}
+ // 7-3、创建渲染矩形框的捆绑包
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_BUNDLE
+ , IID_PPV_ARGS(&g_stQuadPSO.m_pICmdAlloc)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadPSO.m_pICmdAlloc);
+
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_BUNDLE
+ , g_stQuadPSO.m_pICmdAlloc.Get(), nullptr, IID_PPV_ARGS(&g_stQuadPSO.m_pICmdBundles)));
+ GRS_SET_D3D12_DEBUGNAME_COMPTR(g_stQuadPSO.m_pICmdBundles);
+
+ g_stQuadPSO.m_pICmdBundles->SetGraphicsRootSignature(g_stQuadPSO.m_pIRS.Get());
+ g_stQuadPSO.m_pICmdBundles->SetPipelineState(g_stQuadPSO.m_pIPSO.Get());
+
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_stQuadHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_stQuadHeap.m_pISAPHeap.Get());
+
+ g_stQuadPSO.m_pICmdBundles->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUCBVHandle = g_stQuadHeap.m_pICBVSRVHeap->GetGPUDescriptorHandleForHeapStart();
+ //设置CBV
+ g_stQuadPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(0, stGPUCBVHandle);
+
+ // 设置SRV
+ stGPUCBVHandle.ptr += g_stD3DDevice.m_nCBVSRVDescriptorSize;
+ g_stQuadPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(1, stGPUCBVHandle);
+ // 设置Sample
+ g_stQuadPSO.m_pICmdBundles->SetGraphicsRootDescriptorTable(2, g_stQuadHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart());
+ // 设置渲染手法
+ g_stQuadPSO.m_pICmdBundles->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
+ // 设置顶点数据
+ g_stQuadPSO.m_pICmdBundles->IASetVertexBuffers(0, GRS_INSTANCE_DATA_SLOT_CNT, g_stQuadData.m_pstVertexBufferView);
+
+ // Draw Call!!!
+ g_stQuadPSO.m_pICmdBundles->DrawInstanced(g_stQuadData.m_nVertexCount, g_stQuadData.m_nInstanceCount, 0, 0);
+
+ g_stQuadPSO.m_pICmdBundles->Close();
+ }
+ //--------------------------------------------------------------------
+
+ {}
+ // 8-0、设置灯光数据
+ {
+ float fLightZ = -1.0f;
+
+ g_stWorldConstData.m_pstSceneLights->m_v4LightPos[0] = { 0.0f,0.0f,fLightZ,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightPos[1] = { 0.0f,1.0f,fLightZ,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightPos[2] = { 1.0f,-1.0f,fLightZ,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightPos[3] = { -1.0f,-1.0f,fLightZ,1.0f };
+
+ // 注意 PBR的时候 需要很高的光源才有效果
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[0] = { 234.7f,213.1f,207.9f, 1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[1] = { 25.0f,0.0f,0.0f,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[2] = { 0.0f,25.0f,0.0f,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[3] = { 0.0f,0.0f,25.0f,1.0f };
+ }
+
+ D3D12_RESOURCE_BARRIER stBeginResBarrier = {};
+ D3D12_RESOURCE_BARRIER stEneResBarrier = {};
+
+ // 8-1、填充渲染目标的资源屏障结构
+ {
+ stBeginResBarrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ stBeginResBarrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ stBeginResBarrier.Transition.pResource = g_stD3DDevice.m_pIARenderTargets[g_stD3DDevice.m_nFrameIndex].Get();
+ stBeginResBarrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT;
+ stBeginResBarrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ stBeginResBarrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+
+ stEneResBarrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+ stEneResBarrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+ stEneResBarrier.Transition.pResource = g_stD3DDevice.m_pIARenderTargets[g_stD3DDevice.m_nFrameIndex].Get();
+ stEneResBarrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
+ stEneResBarrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;
+ stEneResBarrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+ }
+
+ DWORD dwRet = 0;
+ BOOL bExit = FALSE;
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle = g_stD3DDevice.m_pIRTVHeap->GetCPUDescriptorHandleForHeapStart();
+ D3D12_CPU_DESCRIPTOR_HANDLE stDSVHandle = g_stD3DDevice.m_pIDSVHeap->GetCPUDescriptorHandleForHeapStart();
+
+ FLOAT fStartTime = (FLOAT)::GetTickCount64();
+ FLOAT fCurrentTime = fStartTime;
+ FLOAT fTimeInSeconds = (fCurrentTime - fStartTime) / 1000.0f;
+ FLOAT fDeltaTime = fCurrentTime - fStartTime;
+
+ // 开始正式消息循环前才显示主窗口
+ ShowWindow(g_stD3DDevice.m_hWnd, nCmdShow);
+ UpdateWindow(g_stD3DDevice.m_hWnd);
+
+ MSG msg = {};
+ // 9、消息循环
+ while (!bExit)
+ {
+ dwRet = ::MsgWaitForMultipleObjects(1, &g_stD3DDevice.m_hEventFence, FALSE, INFINITE, QS_ALLINPUT);
+ switch (dwRet - WAIT_OBJECT_0)
+ {
+ case 0:
+ {
+ //-----------------------------------------------------------------------------------------------------
+ // OnUpdate()
+ // Animation Calculate etc.
+ //-----------------------------------------------------------------------------------------------------
+ fCurrentTime = (FLOAT)::GetTickCount64();
+ fDeltaTime = fCurrentTime - fStartTime;
+
+ // Update! with fDeltaTime or fCurrentTime & fStartTime in MS
+
+ //计算旋转的角度:旋转角度(弧度) = 时间(秒) * 角速度(弧度/秒)
+ if (g_bWorldRotate)
+ {// 旋转时 角度才累加 否则就固定不动
+ g_fWorldRotateAngle += ((fDeltaTime) / 1000.0f) * (g_fPalstance * XM_PI / 180.0f);
+ }
+
+ //旋转角度是2PI周期的倍数,去掉周期数,只留下相对0弧度开始的小于2PI的弧度即可
+ if (g_fWorldRotateAngle > XM_2PI)
+ {
+ g_fWorldRotateAngle = fmod(g_fWorldRotateAngle, XM_2PI);
+ }
+
+ // 平凡的世界
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ = XMMatrixIdentity();
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxView
+ = XMMatrixLookToLH(g_stCamera.m_v4EyePos, g_stCamera.m_v4LookDir, g_stCamera.m_v4UpDir);
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxProj
+ = XMMatrixPerspectiveFovLH(XM_PIDIV4
+ , (FLOAT)g_stD3DDevice.m_iWndWidth / (FLOAT)g_stD3DDevice.m_iWndHeight
+ , g_stCamera.m_fNear
+ , g_stCamera.m_fFar);
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorldView
+ = XMMatrixMultiply(
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxView
+ );
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWVP
+ = XMMatrixMultiply(
+ g_stWorldConstData.m_pstSceneMatrix->m_mxWorldView
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxProj
+ );
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxInvWVP
+ = XMMatrixInverse(nullptr
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxWVP);
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxVP
+ = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxView
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxProj);
+
+ g_stWorldConstData.m_pstSceneMatrix->m_mxInvVP
+ = XMMatrixInverse(nullptr
+ , g_stWorldConstData.m_pstSceneMatrix->m_mxVP);
+
+ g_stWorldConstData.m_pstSceneCamera->m_v4EyePos = g_stCamera.m_v4EyePos;
+ g_stWorldConstData.m_pstSceneCamera->m_v4LookAt = XMVectorAdd(g_stCamera.m_v4EyePos, g_stCamera.m_v4LookDir);
+ g_stWorldConstData.m_pstSceneCamera->m_v4UpDir = g_stCamera.m_v4UpDir;
+
+
+ if (g_bUseLight)
+ {// 使用独立的点光源
+ // 注意 PBR的时候 需要很高的光源才有效果
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[0] = { 234.7f,213.1f,207.9f, 1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[1] = { 25.0f,0.0f,0.0f,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[2] = { 0.0f,25.0f,0.0f,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[3] = { 0.0f,0.0f,25.0f,1.0f };
+ }
+ else
+ { // 不使用独立的光源,只有IBL
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[0] = { 0.0f,0.0f,0.0f, 1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[1] = { 0.0f,0.0f,0.0f,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[2] = { 0.0f,0.0f,0.0f,1.0f };
+ g_stWorldConstData.m_pstSceneLights->m_v4LightColors[3] = { 0.0f,0.0f,0.0f,1.0f };
+ }
+
+ fStartTime = fCurrentTime;
+ //-----------------------------------------------------------------------------------------------------
+ // OnRender()
+ //-----------------------------------------------------------------------------------------------------
+ //命令分配器先Reset一下
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDAlloc->Reset());
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Reset(g_stD3DDevice.m_pIMainCMDAlloc.Get(), nullptr));
+
+ g_stD3DDevice.m_nFrameIndex = g_stD3DDevice.m_pISwapChain3->GetCurrentBackBufferIndex();
+
+ g_stD3DDevice.m_pIMainCMDList->RSSetViewports(1, &g_stD3DDevice.m_stViewPort);
+ g_stD3DDevice.m_pIMainCMDList->RSSetScissorRects(1, &g_stD3DDevice.m_stScissorRect);
+
+ // 通过资源屏障判定后缓冲已经切换完毕可以开始渲染了
+ stBeginResBarrier.Transition.pResource = g_stD3DDevice.m_pIARenderTargets[g_stD3DDevice.m_nFrameIndex].Get();
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &stBeginResBarrier);
+
+ // 设置渲染目标
+ stRTVHandle = g_stD3DDevice.m_pIRTVHeap->GetCPUDescriptorHandleForHeapStart();
+ stRTVHandle.ptr += (size_t)g_stD3DDevice.m_nFrameIndex * g_stD3DDevice.m_nRTVDescriptorSize;
+ g_stD3DDevice.m_pIMainCMDList->OMSetRenderTargets(1, &stRTVHandle, FALSE, &stDSVHandle);
+
+ // 继续记录命令,并真正开始新一帧的渲染
+ g_stD3DDevice.m_pIMainCMDList->ClearRenderTargetView(stRTVHandle, g_stD3DDevice.m_faClearColor, 0, nullptr);
+ g_stD3DDevice.m_pIMainCMDList->ClearDepthStencilView(g_stD3DDevice.m_pIDSVHeap->GetCPUDescriptorHandleForHeapStart()
+ , D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, nullptr);
+
+ //-----------------------------------------------------------------------------------------------------
+ // Draw !
+ //-----------------------------------------------------------------------------------------------------
+ // 执行Skybox的捆绑包
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_stSkyBoxHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_stSkyBoxHeap.m_pISAPHeap.Get());
+
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ g_stD3DDevice.m_pIMainCMDList->ExecuteBundle(g_stSkyBoxPSO.m_pICmdBundles.Get());
+ //-----------------------------------------------------------------------------------------------------
+
+ //-----------------------------------------------------------------------------------------------------
+ // 基于IBL 渲染材质小球
+ //-----------------------------------------------------------------------------------------------------
+
+ // 控制小球整体旋转 和 缩放
+ // 旋转是全体的,缩放只针对个体
+ //-----------------------------------------------------------------------------------------------------
+ int iColHalf = (int)g_arPBRMaterial.GetCount() / 2;
+ float fDeltaPos = 5.0f;
+ float fDeltaX = 0.0f;
+ float fDeltaY = 0.0f;
+
+ XMMATRIX mxScale = XMMatrixScaling(g_fScale, g_fScale, g_fScale);
+
+
+ for (int iCol = 0; iCol < (int)g_arPBRMaterial.GetCount(); iCol++)
+ {// 列循环
+ fDeltaX = (iCol - iColHalf) * fDeltaPos;
+
+ //// 先缩放,再平移
+ //g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ // = XMMatrixMultiply(mxScale
+ // , XMMatrixTranslation(fDeltaX, fDeltaY, fDeltaPos));
+ //// 旋转
+ //g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ // = XMMatrixMultiply(g_stWorldConstData.m_pstSceneMatrix->m_mxWorld
+ // ,XMMatrixRotationY(static_cast(g_fWorldRotateAngle)));
+
+ // 缩放 旋转
+ g_arPBRMaterial[iCol].m_pstModelData->m_mxModel2World
+ = XMMatrixMultiply(mxScale
+ , XMMatrixRotationY(static_cast(g_fWorldRotateAngle)));
+ // 平移
+ g_arPBRMaterial[iCol].m_pstModelData->m_mxModel2World
+ = XMMatrixMultiply(g_arPBRMaterial[iCol].m_pstModelData->m_mxModel2World
+ , XMMatrixTranslation(fDeltaX, fDeltaY, fDeltaPos));
+
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootSignature(g_stIBLPSO.m_pIRS.Get());
+ g_stD3DDevice.m_pIMainCMDList->SetPipelineState(g_stIBLPSO.m_pIPSO.Get());
+
+ //const UINT ncCopyCnt = 2;
+ //// 复制描述符
+ //D3D12_CPU_DESCRIPTOR_HANDLE stDestHandle[ncCopyCnt] = {};
+ //stDestHandle[0] = g_stIBLHeap.m_pICBVSRVHeap->GetCPUDescriptorHandleForHeapStart();
+ //stDestHandle[0].ptr += ((g_stIBLPSO.m_nCBVCnt - 1) * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ //stDestHandle[1].ptr = stDestHandle[0].ptr + ((1 + 3) * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+
+ //D3D12_CPU_DESCRIPTOR_HANDLE stSrcHandle[ncCopyCnt] = {};
+ //stSrcHandle[0] = g_arPBRMaterial[iCol].m_pIMaterialHeap->GetCPUDescriptorHandleForHeapStart();
+ //stSrcHandle[1].ptr = stSrcHandle[0].ptr + g_stD3DDevice.m_nCBVSRVDescriptorSize;
+
+ //UINT naDesRangeSizes[ncCopyCnt] = {};
+ //UINT naSrcRangeSizes[ncCopyCnt] = {};
+ //// Copy 1 CBV + 6 SRV
+ //naDesRangeSizes[0] = GRS_MODEL_DATA_CB_CNT;
+ //naSrcRangeSizes[0] = GRS_MODEL_DATA_CB_CNT;
+
+ //naDesRangeSizes[1] = GRS_PBR_MATERIAL_TEXTURE_CNT;
+ //naSrcRangeSizes[1] = GRS_PBR_MATERIAL_TEXTURE_CNT;
+
+ //g_stD3DDevice.m_pID3D12Device4->CopyDescriptors(
+ // ncCopyCnt
+ // , stDestHandle
+ // , naDesRangeSizes
+ // , ncCopyCnt
+ // , stSrcHandle
+ // , naSrcRangeSizes
+ // , D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
+
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_arPBRMaterial[iCol].m_pIMaterialHeap.Get());
+ arHeaps.Add(g_stIBLHeap.m_pISAPHeap.Get());
+
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+
+ D3D12_GPU_DESCRIPTOR_HANDLE stGPUCBVHandle
+ = g_arPBRMaterial[iCol].m_pIMaterialHeap->GetGPUDescriptorHandleForHeapStart();
+ //设置CBV
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(0, stGPUCBVHandle);
+
+ // 设置SRV (space 0)
+ stGPUCBVHandle.ptr += (g_stIBLPSO.m_nCBVCnt * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(1, stGPUCBVHandle);
+
+ // 设置SRV (space 1)
+ stGPUCBVHandle.ptr += (3 * g_stD3DDevice.m_nCBVSRVDescriptorSize);
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(2, stGPUCBVHandle);
+
+ // 设置Sample
+ g_stD3DDevice.m_pIMainCMDList->SetGraphicsRootDescriptorTable(3
+ , g_stIBLHeap.m_pISAPHeap->GetGPUDescriptorHandleForHeapStart());
+
+ // 设置渲染手法
+ g_stD3DDevice.m_pIMainCMDList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ // 设置顶点数据
+ g_stD3DDevice.m_pIMainCMDList->IASetVertexBuffers(0, (UINT)g_stMultiMeshData.m_arVBV.GetCount(), g_stMultiMeshData.m_arVBV.GetData());
+ g_stD3DDevice.m_pIMainCMDList->IASetIndexBuffer(&g_stMultiMeshData.m_stIBV);
+
+ // Draw Call!!!
+ g_stD3DDevice.m_pIMainCMDList->DrawIndexedInstanced(g_stMultiMeshData.m_nIndexCount, 1, 0, 0, 0);
+
+ //D3D12_RESOURCE_BARRIER stRBSwitch = {};
+ //stRBSwitch.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING;
+ ////stRBSwitch.Flags = D3D12_RESOURCE_BARRIER_FLAG_END_ONLY;
+ //stRBSwitch.Aliasing.pResourceAfter = nullptr; //g_arPBRMaterial[(iCol+1)% g_arPBRMaterial.GetCount()].m_pICBModelData.Get();
+ //stRBSwitch.Aliasing.pResourceBefore = g_arPBRMaterial[iCol].m_pICBModelData.Get();
+ //g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &stRBSwitch);
+ // 绘制
+ //g_stD3DDevice.m_pIMainCMDList->ExecuteBundle(g_stIBLPSO.m_pICmdBundles.Get());
+ }
+ //-----------------------------------------------------------------------------------------------------
+
+ //-----------------------------------------------------------------------------------------------------
+ // 执行矩形框的捆绑包
+ if (g_bShowRTA)
+ {
+ arHeaps.RemoveAll();
+ arHeaps.Add(g_stQuadHeap.m_pICBVSRVHeap.Get());
+ arHeaps.Add(g_stQuadHeap.m_pISAPHeap.Get());
+
+ // 设置SRV
+ g_stD3DDevice.m_pIMainCMDList->SetDescriptorHeaps((UINT)arHeaps.GetCount(), arHeaps.GetData());
+ g_stD3DDevice.m_pIMainCMDList->ExecuteBundle(g_stQuadPSO.m_pICmdBundles.Get());
+ }
+ //-----------------------------------------------------------------------------------------------------
+
+ //又一个资源屏障,用于确定渲染已经结束可以提交画面去显示了
+ stEneResBarrier.Transition.pResource = g_stD3DDevice.m_pIARenderTargets[g_stD3DDevice.m_nFrameIndex].Get();
+ g_stD3DDevice.m_pIMainCMDList->ResourceBarrier(1, &stEneResBarrier);
+
+ //关闭命令列表,可以去执行了
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDList->Close());
+
+ //执行命令列表
+ arCmdList.RemoveAll();
+ arCmdList.Add(g_stD3DDevice.m_pIMainCMDList.Get());
+ g_stD3DDevice.m_pIMainCMDQueue->ExecuteCommandLists(static_cast(arCmdList.GetCount()), arCmdList.GetData());
+
+ //提交画面
+ // 如果支持Tearing 那么就用Tearing方式呈现画面
+ UINT nPresentFlags = (g_stD3DDevice.m_bSupportTearing && !g_stD3DDevice.m_bFullScreen) ? DXGI_PRESENT_ALLOW_TEARING : 0;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pISwapChain3->Present(0, nPresentFlags));
+
+ //开始同步GPU与CPU的执行,先记录围栏标记值
+ const UINT64 n64CurrentFenceValue = g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIMainCMDQueue->Signal(g_stD3DDevice.m_pIFence.Get(), n64CurrentFenceValue));
+ ++g_stD3DDevice.m_n64FenceValue;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIFence->SetEventOnCompletion(n64CurrentFenceValue, g_stD3DDevice.m_hEventFence));
+ //-----------------------------------------------------------------------------------------------------
+ }
+ break;
+ case 1:
+ {// 处理消息
+ while (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
+ {
+ if (WM_QUIT != msg.message)
+ {
+ ::TranslateMessage(&msg);
+ ::DispatchMessage(&msg);
+ }
+ else
+ {
+ bExit = TRUE;
+ }
+ }
+ }
+ default:
+ break;
+ }
+ }
+
+ if (nullptr != g_stHDRData.m_pfHDRData)
+ {// 释放 HDR 图片数据
+ stbi_image_free(g_stHDRData.m_pfHDRData);
+ g_stHDRData.m_pfHDRData = nullptr;
+ }
+ }
+ catch (CAtlException& e)
+ {//发生了COM异常
+ e;
+ }
+ catch (...)
+ {
+
+ }
+ return 0;
+}
+
+void OnSize(UINT width, UINT height, bool minimized)
+{
+ if ((width == g_stD3DDevice.m_iWndWidth && height == g_stD3DDevice.m_iWndHeight)
+ || minimized
+ || (nullptr == g_stD3DDevice.m_pISwapChain3)
+ || (0 == width)
+ || (0 == height))
+ {
+ return;
+ }
+
+ try
+ {
+ // 1、消息循环旁路
+ if (WAIT_OBJECT_0 != ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE))
+ {
+ GRS_THROW_IF_FAILED(HRESULT_FROM_WIN32(GetLastError()));
+ }
+
+ // 2、释放获取的后缓冲对象接口
+ for (UINT i = 0; i < g_nFrameBackBufCount; i++)
+ {
+ g_stD3DDevice.m_pIARenderTargets[i].Reset();
+
+ }
+
+ // 3、交换链重置大小
+ DXGI_SWAP_CHAIN_DESC stSWDesc = {};
+ g_stD3DDevice.m_pISwapChain3->GetDesc(&stSWDesc);
+
+ HRESULT hr = g_stD3DDevice.m_pISwapChain3->ResizeBuffers(g_nFrameBackBufCount
+ , width
+ , height
+ , stSWDesc.BufferDesc.Format
+ , stSWDesc.Flags);
+
+ GRS_THROW_IF_FAILED(hr);
+
+ // 4、得到当前后缓冲索引
+ g_stD3DDevice.m_nFrameIndex = g_stD3DDevice.m_pISwapChain3->GetCurrentBackBufferIndex();
+
+ // 5、保存变换后的尺寸
+ g_stD3DDevice.m_iWndWidth = width;
+ g_stD3DDevice.m_iWndHeight = height;
+
+ // 6、创建RTV的描述符
+ ComPtr pID3D12Device;
+ ComPtr pID3D12Device4;
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pIRTVHeap->GetDevice(IID_PPV_ARGS(&pID3D12Device)));
+ GRS_THROW_IF_FAILED(pID3D12Device.As(&pID3D12Device4));
+ {
+ D3D12_CPU_DESCRIPTOR_HANDLE stRTVHandle
+ = g_stD3DDevice.m_pIRTVHeap->GetCPUDescriptorHandleForHeapStart();
+ for (UINT i = 0; i < g_nFrameBackBufCount; i++)
+ {
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pISwapChain3->GetBuffer(i
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIARenderTargets[i])));
+
+ GRS_SET_D3D12_DEBUGNAME_INDEXED_COMPTR(g_stD3DDevice.m_pIARenderTargets, i);
+
+ pID3D12Device4->CreateRenderTargetView(g_stD3DDevice.m_pIARenderTargets[i].Get()
+ , nullptr
+ , stRTVHandle);
+
+ stRTVHandle.ptr += g_stD3DDevice.m_nRTVDescriptorSize;
+ }
+ }
+
+ // 7、创建深度缓冲及深度缓冲描述符堆
+ {
+ D3D12_DEPTH_STENCIL_VIEW_DESC stDepthStencilDesc = {};
+ D3D12_CLEAR_VALUE stDepthOptimizedClearValue = {};
+ D3D12_RESOURCE_DESC stDSTex2DDesc = {};
+
+ stDepthOptimizedClearValue.Format = g_stD3DDevice.m_emDepthStencilFormat;
+ stDepthOptimizedClearValue.DepthStencil.Depth = 1.0f;
+ stDepthOptimizedClearValue.DepthStencil.Stencil = 0;
+
+ stDSTex2DDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+ stDSTex2DDesc.Alignment = 0;
+ stDSTex2DDesc.Width = g_stD3DDevice.m_iWndWidth;
+ stDSTex2DDesc.Height = g_stD3DDevice.m_iWndHeight;
+ stDSTex2DDesc.DepthOrArraySize = 1;
+ stDSTex2DDesc.MipLevels = 0;
+ stDSTex2DDesc.Format = g_stD3DDevice.m_emDepthStencilFormat;
+ stDSTex2DDesc.SampleDesc.Count = 1;
+ stDSTex2DDesc.SampleDesc.Quality = 0;
+ stDSTex2DDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ stDSTex2DDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
+
+ // 释放深度缓冲先
+ g_stD3DDevice.m_pIDepthStencilBuffer.Reset();
+
+ //使用隐式默认堆创建一个深度蜡板缓冲区,
+ //因为基本上深度缓冲区会一直被使用,重用的意义不大,所以直接使用隐式堆,图方便
+ GRS_THROW_IF_FAILED(g_stD3DDevice.m_pID3D12Device4->CreateCommittedResource(
+ &g_stDefaultHeapProps
+ , D3D12_HEAP_FLAG_NONE
+ , &stDSTex2DDesc
+ , D3D12_RESOURCE_STATE_DEPTH_WRITE
+ , &stDepthOptimizedClearValue
+ , IID_PPV_ARGS(&g_stD3DDevice.m_pIDepthStencilBuffer)
+ ));
+
+ stDepthStencilDesc.Format = g_stD3DDevice.m_emDepthStencilFormat;
+ stDepthStencilDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
+ stDepthStencilDesc.Flags = D3D12_DSV_FLAG_NONE;
+
+ // 然后直接重建描述符
+ g_stD3DDevice.m_pID3D12Device4->CreateDepthStencilView(g_stD3DDevice.m_pIDepthStencilBuffer.Get()
+ , &stDepthStencilDesc
+ , g_stD3DDevice.m_pIDSVHeap->GetCPUDescriptorHandleForHeapStart());
+ }
+
+ // 8、更新视口大小和齐次包围盒大小
+ g_stD3DDevice.m_stViewPort.TopLeftX = 0.0f;
+ g_stD3DDevice.m_stViewPort.TopLeftY = 0.0f;
+ g_stD3DDevice.m_stViewPort.Width = static_cast(g_stD3DDevice.m_iWndWidth);
+ g_stD3DDevice.m_stViewPort.Height = static_cast(g_stD3DDevice.m_iWndHeight);
+
+ g_stD3DDevice.m_stScissorRect.left = static_cast(g_stD3DDevice.m_stViewPort.TopLeftX);
+ g_stD3DDevice.m_stScissorRect.right = static_cast(g_stD3DDevice.m_stViewPort.TopLeftX + g_stD3DDevice.m_stViewPort.Width);
+ g_stD3DDevice.m_stScissorRect.top = static_cast(g_stD3DDevice.m_stViewPort.TopLeftY);
+ g_stD3DDevice.m_stScissorRect.bottom = static_cast(g_stD3DDevice.m_stViewPort.TopLeftY + g_stD3DDevice.m_stViewPort.Height);
+
+ // 9、重新设定正交矩阵
+ g_stQuadConstData.m_pstSceneMatrix->m_mxWorld = XMMatrixIdentity();
+ g_stQuadConstData.m_pstSceneMatrix->m_mxView = XMMatrixIdentity();
+
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj = XMMatrixScaling(1.0f, -1.0f, 1.0f); //上下翻转,配合之前的Quad的Vertex坐标一起使用
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj = XMMatrixMultiply(g_stQuadConstData.m_pstSceneMatrix->m_mxProj, XMMatrixTranslation(-0.5f, +0.5f, 0.0f)); //微量偏移,矫正像素位置
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj = XMMatrixMultiply(
+ g_stQuadConstData.m_pstSceneMatrix->m_mxProj
+ , XMMatrixOrthographicOffCenterLH(g_stD3DDevice.m_stViewPort.TopLeftX
+ , g_stD3DDevice.m_stViewPort.TopLeftX + g_stD3DDevice.m_stViewPort.Width
+ , -(g_stD3DDevice.m_stViewPort.TopLeftY + g_stD3DDevice.m_stViewPort.Height)
+ , -g_stD3DDevice.m_stViewPort.TopLeftY
+ , g_stD3DDevice.m_stViewPort.MinDepth
+ , g_stD3DDevice.m_stViewPort.MaxDepth)
+ );
+ // View * Orthographic 正交投影时,视矩阵通常是一个单位矩阵,这里之所以乘一下以表示与射影投影一致
+ g_stQuadConstData.m_pstSceneMatrix->m_mxWorldView = XMMatrixMultiply(g_stQuadConstData.m_pstSceneMatrix->m_mxWorld, g_stQuadConstData.m_pstSceneMatrix->m_mxView);
+ g_stQuadConstData.m_pstSceneMatrix->m_mxWVP = XMMatrixMultiply(g_stQuadConstData.m_pstSceneMatrix->m_mxWorldView, g_stQuadConstData.m_pstSceneMatrix->m_mxProj);
+
+ //---------------------------------------------------------------------------------------------
+ // 更新天空盒远平面尺寸
+ float fHighW = -1.0f - (1.0f / (float)g_stD3DDevice.m_iWndWidth);
+ float fHighH = -1.0f - (1.0f / (float)g_stD3DDevice.m_iWndHeight);
+ float fLowW = 1.0f + (1.0f / (float)g_stD3DDevice.m_iWndWidth);
+ float fLowH = 1.0f + (1.0f / (float)g_stD3DDevice.m_iWndHeight);
+
+ ST_GRS_VERTEX_CUBE_BOX stSkyboxVertices[4] = {};
+
+ stSkyboxVertices[0].m_v4Position = XMFLOAT4(fLowW, fLowH, 1.0f, 1.0f);
+ stSkyboxVertices[1].m_v4Position = XMFLOAT4(fLowW, fHighH, 1.0f, 1.0f);
+ stSkyboxVertices[2].m_v4Position = XMFLOAT4(fHighW, fLowH, 1.0f, 1.0f);
+ stSkyboxVertices[3].m_v4Position = XMFLOAT4(fHighW, fHighH, 1.0f, 1.0f);
+
+ //加载天空盒子的数据
+ g_stBufferResSesc.Width = GRS_UPPER(sizeof(stSkyboxVertices), D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT);
+
+ //使用map-memcpy-unmap大法将数据传至顶点缓冲对象
+ ST_GRS_VERTEX_CUBE_BOX* pBufferData = nullptr;
+
+ GRS_THROW_IF_FAILED(g_stSkyBoxData.m_pIVertexBuffer->Map(0, nullptr, reinterpret_cast(&pBufferData)));
+ memcpy(pBufferData, stSkyboxVertices, sizeof(stSkyboxVertices));
+ g_stSkyBoxData.m_pIVertexBuffer->Unmap(0, nullptr);
+ //---------------------------------------------------------------------------------------------
+
+ // 10、设置下事件状态,从消息旁路返回主消息循环
+ SetEvent(g_stD3DDevice.m_hEventFence);
+ }
+ catch (CAtlException& e)
+ {//发生了COM异常
+ e;
+ }
+ catch (...)
+ {
+
+ }
+
+}
+
+void SwitchFullScreenWindow()
+{
+ if (g_stD3DDevice.m_bFullScreen)
+ {// 还原为窗口化
+ SetWindowLong(g_stD3DDevice.m_hWnd, GWL_STYLE, g_stD3DDevice.m_dwWndStyle);
+
+ SetWindowPos(
+ g_stD3DDevice.m_hWnd,
+ HWND_NOTOPMOST,
+ g_stD3DDevice.m_rtWnd.left,
+ g_stD3DDevice.m_rtWnd.top,
+ g_stD3DDevice.m_rtWnd.right - g_stD3DDevice.m_rtWnd.left,
+ g_stD3DDevice.m_rtWnd.bottom - g_stD3DDevice.m_rtWnd.top,
+ SWP_FRAMECHANGED | SWP_NOACTIVATE);
+
+ ShowWindow(g_stD3DDevice.m_hWnd, SW_NORMAL);
+ }
+ else
+ {// 全屏显示
+ // 保存窗口的原始尺寸
+ GetWindowRect(g_stD3DDevice.m_hWnd, &g_stD3DDevice.m_rtWnd);
+
+ // 使窗口无边框,以便客户区可以填满屏幕。
+ SetWindowLong(g_stD3DDevice.m_hWnd
+ , GWL_STYLE
+ , g_stD3DDevice.m_dwWndStyle
+ & ~(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME));
+
+ RECT stFullscreenWindowRect = {};
+ ComPtr pIOutput;
+ DXGI_OUTPUT_DESC stOutputDesc = {};
+ HRESULT _hr = g_stD3DDevice.m_pISwapChain3->GetContainingOutput(&pIOutput);
+ if (SUCCEEDED(g_stD3DDevice.m_pISwapChain3->GetContainingOutput(&pIOutput)) &&
+ SUCCEEDED(pIOutput->GetDesc(&stOutputDesc)))
+ {// 使用显示器最大显示尺寸
+ stFullscreenWindowRect = stOutputDesc.DesktopCoordinates;
+ }
+ else
+ {// 获取系统设置的分辨率
+ DEVMODE stDevMode = {};
+ stDevMode.dmSize = sizeof(DEVMODE);
+ EnumDisplaySettings(nullptr, ENUM_CURRENT_SETTINGS, &stDevMode);
+
+ stFullscreenWindowRect = {
+ stDevMode.dmPosition.x,
+ stDevMode.dmPosition.y,
+ stDevMode.dmPosition.x + static_cast(stDevMode.dmPelsWidth),
+ stDevMode.dmPosition.y + static_cast(stDevMode.dmPelsHeight)
+ };
+ }
+
+ // 设置窗口最大化
+ SetWindowPos(
+ g_stD3DDevice.m_hWnd,
+ HWND_TOPMOST,
+ stFullscreenWindowRect.left,
+ stFullscreenWindowRect.top,
+ stFullscreenWindowRect.right,
+ stFullscreenWindowRect.bottom,
+ SWP_FRAMECHANGED | SWP_NOACTIVATE);
+
+ ShowWindow(g_stD3DDevice.m_hWnd, SW_MAXIMIZE);
+ }
+
+ g_stD3DDevice.m_bFullScreen = !!!g_stD3DDevice.m_bFullScreen;
+}
+
+VOID ScreenPt2Vector(const float& fPtX, const float& fPtY, const float& fScreenWidth, const float& fScreenHeight, const float& fArcBallRaius, XMVECTOR& v)
+{
+ FLOAT x = -(fPtX - fScreenWidth / 2.0f) / (fArcBallRaius * fScreenWidth / 2.0f);
+ FLOAT y = (fPtY - fScreenHeight / 2.0f) / (fArcBallRaius * fScreenHeight / 2.0f);
+
+ FLOAT z = 0.0f;
+ FLOAT mag = x * x + y * y;
+
+ if (mag > 1.0f)
+ {
+ FLOAT scale = 1.0f / sqrtf(mag);
+ x *= scale;
+ y *= scale;
+ }
+ else
+ {
+ z = sqrtf(1.0f - mag);
+ }
+
+ v = XMVectorSet(x, y, z, 0.0f);
+}
+
+VOID QuaternionWithVector(XMVECTOR& v1, XMVECTOR& v2, XMVECTOR& vQ)
+{
+ XMVECTOR v1n = XMVector3Normalize(v1);
+ XMVECTOR v2n = XMVector3Normalize(v2);
+
+ vQ = XMVector3Cross(v1n, v2n);
+ vQ = XMVectorSetW(vQ, XMVectorGetX(XMVector3Dot(v1n, v2n)));
+}
+
+BOOL GRSCameraProcessMouseMsg(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ if (WM_LBUTTONDOWN == message)
+ {
+ ::SetCapture(hWnd);
+ ScreenPt2Vector(
+ (float)LOWORD(lParam)
+ , (float)HIWORD(lParam)
+ , (float)g_stD3DDevice.m_iWndWidth
+ , (float)g_stD3DDevice.m_iWndHeight
+ , g_stCameraControl.m_fRadius
+ , g_stCameraControl.m_vCameraPosStart);
+
+ //g_qCameraStart = g_qCameraMoves;
+
+ return TRUE;
+ }
+
+ if ((WM_MOUSEMOVE == message) && (MK_LBUTTON & wParam))
+ {
+ float fMoveX = (float)(short)LOWORD(lParam);
+ float fMoveY = (float)(short)HIWORD(lParam);
+
+ ScreenPt2Vector(fMoveX
+ , fMoveY
+ , (float)g_stD3DDevice.m_iWndWidth
+ , (float)g_stD3DDevice.m_iWndHeight
+ , g_stCameraControl.m_fRadius
+ , g_stCameraControl.m_vCameraPosMoves);
+
+ QuaternionWithVector(g_stCameraControl.m_vCameraPosStart, g_stCameraControl.m_vCameraPosMoves, g_stCameraControl.m_qCameraMoves);
+
+ g_stCameraControl.m_qCameraMoves = XMQuaternionMultiply(g_stCameraControl.m_qCameraStart, g_stCameraControl.m_qCameraMoves);
+
+ XMMATRIX mxRot = XMMatrixRotationQuaternion(g_stCameraControl.m_qCameraMoves);
+
+ g_stCamera.m_v4LookDir = XMVector3Transform(g_stCamera.m_v4LookDir, mxRot);
+ g_stCamera.m_v4UpDir = XMVector3Transform(g_stCamera.m_v4UpDir, mxRot);
+
+ XMVECTOR vRight = XMVector3Cross(g_stCamera.m_v4UpDir, g_stCamera.m_v4LookDir);
+ g_stCamera.m_v4UpDir = XMVector3Cross(g_stCamera.m_v4LookDir, vRight);
+
+ return TRUE;
+ }
+
+ if (WM_LBUTTONUP == message)
+ {
+ ::ReleaseCapture();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+BOOL GRSCameraProcessKeyMsg(UINT message, WPARAM wParam, LPARAM lParam)
+{
+ if (WM_KEYDOWN != message)
+ {
+ return FALSE;
+ }
+ BOOL bRet = FALSE;
+ USHORT n16KeyCode = (wParam & 0xFF);
+
+ //-------------------------------------------------------------------------------
+ // 基本摄像机位置移动操作
+ float fMoveSpeed = 1.0f;
+ float fDeltaDisplacement = fMoveSpeed;// fmax(fMoveSpeed * g_stTimer.m_fDeltaTimeInMS, 0.5f);
+
+ XMVECTOR vVelocity = { 0.0f,0.0f,0.0f,0.0f };
+
+ // Z-轴
+ if (VK_UP == n16KeyCode || 'w' == n16KeyCode || 'W' == n16KeyCode)
+ {
+ vVelocity = XMVectorSetZ(vVelocity, fDeltaDisplacement);
+ bRet = TRUE;
+ }
+
+ if (VK_DOWN == n16KeyCode || 's' == n16KeyCode || 'S' == n16KeyCode)
+ {
+ vVelocity = XMVectorSetZ(vVelocity, -fDeltaDisplacement);
+ bRet = TRUE;
+ }
+
+ // X-轴
+ if (VK_LEFT == n16KeyCode || 'a' == n16KeyCode || 'A' == n16KeyCode)
+ {
+ vVelocity = XMVectorSetX(vVelocity, fDeltaDisplacement);
+ bRet = TRUE;
+ }
+
+ if (VK_RIGHT == n16KeyCode || 'd' == n16KeyCode || 'D' == n16KeyCode)
+ {
+ vVelocity = XMVectorSetX(vVelocity, -fDeltaDisplacement);
+ bRet = TRUE;
+ }
+
+ // Y-轴
+ if (VK_PRIOR == n16KeyCode || 'r' == n16KeyCode || 'R' == n16KeyCode)
+ {
+ vVelocity = XMVectorSetY(vVelocity, fDeltaDisplacement);
+ bRet = TRUE;
+ }
+
+ if (VK_NEXT == n16KeyCode || 'f' == n16KeyCode || 'F' == n16KeyCode)
+ {
+ vVelocity = XMVectorSetY(vVelocity, -fDeltaDisplacement);
+ bRet = TRUE;
+ }
+
+ XMVECTOR vRight = XMVector3Cross(g_stCamera.m_v4UpDir, g_stCamera.m_v4LookDir);
+
+ g_stCamera.m_v4EyePos = XMVectorAdd(g_stCamera.m_v4EyePos, XMVectorScale(vRight, XMVectorGetX(vVelocity)));
+ g_stCamera.m_v4EyePos = XMVectorAdd(g_stCamera.m_v4EyePos, XMVectorScale(g_stCamera.m_v4UpDir, XMVectorGetY(vVelocity)));
+ g_stCamera.m_v4EyePos = XMVectorAdd(g_stCamera.m_v4EyePos, XMVectorScale(g_stCamera.m_v4LookDir, XMVectorGetZ(vVelocity)));
+
+ //-------------------------------------------------------------------------------
+ return bRet;
+}
+
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_DESTROY:
+ {
+ // 旁路一下消息循环
+ if (WAIT_OBJECT_0 == ::WaitForSingleObject(g_stD3DDevice.m_hEventFence, INFINITE)
+ && g_stD3DDevice.m_bSupportTearing
+ && g_stD3DDevice.m_pISwapChain3)
+ {// 支持Tearing时,自动退出下全屏状态
+ g_stD3DDevice.m_pISwapChain3->SetFullscreenState(FALSE, nullptr);
+ }
+ PostQuitMessage(0);
+ }
+ break;
+ case WM_LBUTTONDOWN:
+ case WM_MOUSEMOVE:
+ case WM_LBUTTONUP:
+ {
+ GRSCameraProcessMouseMsg(hWnd, message, wParam, lParam);
+ }
+ break;
+
+ case WM_KEYDOWN:
+ {
+ USHORT n16KeyCode = (wParam & 0xFF);
+ if (VK_ESCAPE == n16KeyCode)
+ {// Esc键退出
+ ::DestroyWindow(hWnd);
+ }
+
+ if (VK_TAB == n16KeyCode)
+ {// 按Tab键 控制是否显示中间渲染结果的Texture
+ g_bShowRTA = !!!g_bShowRTA;
+ }
+
+ if (VK_SPACE == n16KeyCode)
+ {// 按Space键 控制独立光源的开启与关闭
+ g_bUseLight = !!!g_bUseLight;
+ }
+
+ if (VK_F2 == n16KeyCode)
+ {// F3键
+ // 还原相机位置
+ g_stCamera.m_v4EyePos = XMVectorSet(0.0f, 10.0f, -10.0f, 1.0f); // 位置
+ g_stCamera.m_v4LookDir = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); // 朝向
+ g_stCamera.m_v4UpDir = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); // 上方
+ }
+ //-------------------------------------------------------------------------------
+ // 基本摄像机位置移动操作
+ GRSCameraProcessKeyMsg(message, wParam, lParam);
+ //-------------------------------------------------------------------------------
+
+ float fZoom = 0.1f;
+ if ('z' == n16KeyCode || 'Z' == n16KeyCode)
+ {
+ g_fScale *= (1 + fZoom);
+ }
+ if ('c' == n16KeyCode || 'C' == n16KeyCode)
+ {
+ g_fScale /= (1 + fZoom);
+ }
+
+ if (VK_ADD == n16KeyCode || VK_OEM_PLUS == n16KeyCode)
+ {// + 键
+
+ }
+
+ if (VK_SUBTRACT == n16KeyCode || VK_OEM_MINUS == n16KeyCode)
+ {// - 键
+
+ }
+
+ if (VK_MULTIPLY == n16KeyCode)
+ {// * 键 控制旋转速度 增加
+ g_fPalstance = ((g_fPalstance >= 180.0f) ? 180.0f : (g_fPalstance + 1.0f));
+ }
+
+ if (VK_DIVIDE == n16KeyCode)
+ {// / 键 控制旋转速度 减少
+ g_fPalstance = ((g_fPalstance > 1.0f) ? (g_fPalstance - 1.0f) : 1.0f);
+ }
+
+ if (VK_SHIFT == n16KeyCode)
+ {// 控制材质球矩阵是否旋转
+ g_bWorldRotate = !!!g_bWorldRotate;
+ }
+ }
+ break;
+ case WM_SIZE:
+ {
+ ::GetClientRect(hWnd, &g_stD3DDevice.m_rtWndClient);
+ OnSize(g_stD3DDevice.m_rtWndClient.right - g_stD3DDevice.m_rtWndClient.left
+ , g_stD3DDevice.m_rtWndClient.bottom - g_stD3DDevice.m_rtWndClient.top
+ , wParam == SIZE_MINIMIZED);
+ return 0; // 不再让系统继续处理
+ }
+ break;
+ case WM_GETMINMAXINFO:
+ {// 限制窗口最小大小为1024*768
+ MINMAXINFO* pMMInfo = (MINMAXINFO*)lParam;
+ pMMInfo->ptMinTrackSize.x = 1024;
+ pMMInfo->ptMinTrackSize.y = 768;
+ return 0;
+ }
+ break;
+ case WM_SYSKEYDOWN:
+ {
+ if ((wParam == VK_RETURN) && (lParam & (1 << 29)))
+ {// 处理Alt + Entry
+ if (g_stD3DDevice.m_bSupportTearing)
+ {
+ SwitchFullScreenWindow();
+ return 0;
+ }
+ }
+ }
+ break;
+ default:
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
diff --git a/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj
new file mode 100644
index 0000000000000000000000000000000000000000..aa0661f2a7d7b4ccf419937cb0ac997b62f9ad90
--- /dev/null
+++ b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj
@@ -0,0 +1,304 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ Win32Proj
+ {5cb8b4f5-1bf1-475d-b0a0-83be20e30061}
+ My27IBLWithMaterialTexture
+ 10.0
+
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)include;$(IncludePath)
+
+
+ false
+ $(SolutionDir)include;$(IncludePath)
+
+
+ true
+ $(SolutionDir)include;$(IncludePath)
+ $(SolutionDir)lib;$(LibraryPath)
+
+
+ false
+ $(SolutionDir)include;$(IncludePath)
+ $(SolutionDir)lib;$(LibraryPath)
+
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+ true
+ true
+
+
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Windows
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ VSMain
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ VSMain
+ Vertex
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ GSMain
+ Geometry
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ GSMain
+ Geometry
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ VSMain
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ VSMain
+ Vertex
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ VSMain
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ VSMain
+ Vertex
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ SkyboxVS
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ SkyboxVS
+ Vertex
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ SkyboxVS
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ SkyboxVS
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ SkyboxVS
+ Vertex
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ SkyboxVS
+ Vertex
+ 5.1
+
+
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ $(ProjectDir)Shader\;$(SolutionDir)Shader\;
+ PSMain
+ Pixel
+ 5.1
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj.filters b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj.filters
new file mode 100644
index 0000000000000000000000000000000000000000..a98b6dbc201145c0c172ac08f7f5f920c3b23a05
--- /dev/null
+++ b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj.filters
@@ -0,0 +1,82 @@
+锘
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {a483a90b-a366-49f3-96e1-68b3e46aa6a4}
+
+
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠
+
+
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+ Shader
+
+
+
+
+ 澶存枃浠
+
+
+
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj.user b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj.user
new file mode 100644
index 0000000000000000000000000000000000000000..88a550947edbc3c5003a41726f0749201fdb6822
--- /dev/null
+++ b/27-IBL-With-Material-Texture/27-IBL-With-Material-Texture.vcxproj.user
@@ -0,0 +1,4 @@
+锘
+
+
+
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/0-2 GRS_PBR_Function.hlsli b/27-IBL-With-Material-Texture/Shader/0-2 GRS_PBR_Function.hlsli
new file mode 100644
index 0000000000000000000000000000000000000000..6ca6b8b33bd62d2dcd162ae3ad5f94032437fd86
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/0-2 GRS_PBR_Function.hlsli
@@ -0,0 +1,134 @@
+
+#define PI 3.14159265359
+#define TWO_PI 6.28318530718
+#define FOUR_PI 12.56637061436
+#define FOUR_PI2 39.47841760436
+#define INV_PI 0.31830988618
+#define INV_TWO_PI 0.15915494309
+#define INV_FOUR_PI 0.07957747155
+#define HALF_PI 1.57079632679
+#define INV_HALF_PI 0.636619772367
+
+float RadicalInverse_VdC(uint bits)
+{
+ bits = (bits << 16u) | (bits >> 16u);
+ bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
+ bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
+ bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
+ bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
+ return float(bits) * 2.3283064365386963e-10; // / 0x100000000
+}
+
+float2 Hammersley(uint i, uint N)
+{
+ return float2(float(i) / float(N), RadicalInverse_VdC(i));
+}
+
+// 等距柱状投影 转换到 Cube Map 的纹理坐标系
+// 下面这段直接来自OpenGL的教程
+//static const float2 invAtan = float2(0.1591, 0.3183);
+//
+//float2 SampleSphericalMap(float3 v)
+//{
+// //float2 v2UV = float2(atan(v.z/v.x), asin(v.y));
+// float2 v2UV = float2(atan2(v.z, v.x), asin(v.y));
+// v2UV *= invAtan;
+// v2UV += 0.5;
+// return v2UV;
+//}
+
+// 下面这个是修正后的HLSL版本
+float2 SampleSphericalMap(float3 coord)
+{
+ float theta = acos(coord.y);
+ float phi = atan2(coord.x, coord.z);
+ phi += (phi < 0) ? 2 * PI : 0;
+
+ float u = phi * 0.1591f;
+ float v = theta * 0.3183f;
+ return float2(u, v);
+}
+
+
+float DistributionGGX(float3 N, float3 H, float roughness)
+{
+ float a = roughness * roughness;
+ float a2 = a * a;
+ float NdotH = max(dot(N, H), 0.0f);
+ float NdotH2 = NdotH * NdotH;
+
+ float nom = a2;
+ float denom = (NdotH2 * (a2 - 1.0f) + 1.0f);
+ denom = PI * denom * denom;
+
+ return nom / denom;
+}
+
+float GeometrySchlickGGX_DirectLight(float NdotV, float roughness)
+{// Point Light Versions
+ float r = (roughness + 1.0);
+ float k = (r * r) / 8.0;
+
+ float nom = NdotV;
+ float denom = NdotV * (1.0 - k) + k;
+
+ return nom / denom;
+}
+
+float GeometrySchlickGGX_IBL(float NdotV, float roughness)
+{// IBL Versions
+ float a = roughness;
+ float k = (a * a) / 2.0f;
+
+ float nom = NdotV;
+ float denom = NdotV * (1.0f - k) + k;
+
+ return nom / denom;
+}
+
+float GeometrySmith_DirectLight(float NdotV,float NdotL, float roughness)
+{
+ float ggx2 = GeometrySchlickGGX_DirectLight(NdotV, roughness);
+ float ggx1 = GeometrySchlickGGX_DirectLight(NdotL, roughness);
+
+ return ggx1 * ggx2;
+}
+
+float GeometrySmith_IBL(float NdotV,float NdotL, float roughness)
+{
+ float ggx2 = GeometrySchlickGGX_IBL(NdotV, roughness);
+ float ggx1 = GeometrySchlickGGX_IBL(NdotL, roughness);
+
+ return ggx1 * ggx2;
+}
+
+float3 FresnelSchlick(float cosTheta, float3 F0)
+{
+ return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
+}
+
+float3 FresnelSchlickRoughness(float cosTheta, float3 F0, float roughness)
+{
+ return F0 + (max(float3(1.0 - roughness, 1.0 - roughness, 1.0 - roughness), F0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
+}
+
+float3 ImportanceSampleGGX(float2 Xi, float3 N, float roughness)
+{
+ float a = roughness * roughness;
+
+ float phi = 2.0f * PI * Xi.x;
+ float cosTheta = sqrt((1.0f - Xi.y) / (1.0f + (a * a - 1.0f) * Xi.y));
+ float sinTheta = sqrt(1.0f - cosTheta * cosTheta);
+
+ float3 H;
+ H.x = cos(phi) * sinTheta;
+ H.y = sin(phi) * sinTheta;
+ H.z = cosTheta;
+
+ float3 up = abs(N.z) < 0.999 ? float3(0.0f, 0.0f, 1.0f) : float3(1.0f, 0.0f, 0.0f);
+ float3 tangent = normalize(cross(up, N));
+ float3 bitangent = cross(N, tangent);
+
+ float3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z;
+ return normalize(sampleVec);
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/0-3 GRS_Scene_CB_Def.hlsli b/27-IBL-With-Material-Texture/Shader/0-3 GRS_Scene_CB_Def.hlsli
new file mode 100644
index 0000000000000000000000000000000000000000..0ebb7a1106ddf749efdcaaf7b2e2f749673a9bde
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/0-3 GRS_Scene_CB_Def.hlsli
@@ -0,0 +1,50 @@
+
+#define GRS_CUBE_MAP_FACE_CNT 6
+#define GRS_LIGHT_COUNT 4
+
+cbuffer CB_GRS_SCENE_MATRIX : register(b0)
+{
+ matrix g_mxWorld;
+ matrix g_mxView;
+ matrix g_mxProj;
+ matrix g_mxWorldView;
+ matrix g_mxWVP;
+ matrix g_mxInvWVP;
+ matrix g_mxVP;
+ matrix g_mxInvVP;
+};
+
+cbuffer CB_GRS_GS_VIEW_MATRIX : register(b1)
+{
+ matrix g_mxGSCubeView[GRS_CUBE_MAP_FACE_CNT]; // View matrices for cube map rendering
+};
+
+// Camera
+cbuffer CB_GRS_SCENE_CAMERA : register(b2)
+{
+ float4 g_v4EyePos;
+ float4 g_v4LookAt;
+ float4 g_v4UpDir ;
+}
+
+// lights
+cbuffer CB_GRS_SCENE_LIGHTS : register(b3)
+{
+ float4 g_v4LightPos[GRS_LIGHT_COUNT];
+ float4 g_v4LightColors[GRS_LIGHT_COUNT];
+};
+
+// Material
+// 以下这些材质参数主要用于生成预积分贴图,与场景中物体表面材质没有关系
+cbuffer CB_GRS_PBR_MATERIAL : register(b4)
+{
+ float g_fMetallic; // 金属度
+ float g_fRoughness; // 粗糙度
+ float g_fAO; // 环境遮挡系数
+ float4 g_v4Albedo; // 反射率
+};
+
+cbuffer CB_GRS_MODEL_DATA : register(b5)
+{
+ matrix g_mxModel2World;
+};
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/1-1 GRS_6Times_HDR_2_Cubemap_VS.hlsl b/27-IBL-With-Material-Texture/Shader/1-1 GRS_6Times_HDR_2_Cubemap_VS.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..5d16ddc16fec59b9199ffb84a12b5adea2c10999
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/1-1 GRS_6Times_HDR_2_Cubemap_VS.hlsl
@@ -0,0 +1,23 @@
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+struct ST_GRS_HLSL_VS_IN
+{
+ float4 m_v4LPos : POSITION; // Model Local position
+};
+
+struct ST_GRS_HLSL_VS_OUT
+{
+ float4 m_v4HPos : SV_POSITION; // Projection coord
+ float4 m_v4WPos : POSITION; // World position
+};
+
+ST_GRS_HLSL_VS_OUT VSMain(ST_GRS_HLSL_VS_IN stVSInput)
+{
+ ST_GRS_HLSL_VS_OUT stVSOutput;
+
+ stVSOutput.m_v4WPos = stVSInput.m_v4LPos;
+ // 从模型空间转换到世界坐标系
+ stVSOutput.m_v4HPos = mul(stVSInput.m_v4LPos, g_mxWVP);
+
+ return stVSOutput;
+}
diff --git a/27-IBL-With-Material-Texture/Shader/1-2 GRS_1Times_GS_HDR_2_CubeMap_VS_GS.hlsl b/27-IBL-With-Material-Texture/Shader/1-2 GRS_1Times_GS_HDR_2_CubeMap_VS_GS.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..64174c1f905395fc92ca14e29fcb16fcf7556120
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/1-2 GRS_1Times_GS_HDR_2_CubeMap_VS_GS.hlsl
@@ -0,0 +1,51 @@
+
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+struct ST_GRS_HLSL_VS_IN
+{
+ float4 m_v4LPos : POSITION; // Model Local position
+};
+
+struct ST_GRS_HLSL_GS_IN
+{
+ float4 m_v4WPos : SV_POSITION; // World position
+};
+
+struct ST_GRS_HLSL_GS_OUT
+{
+ float4 m_v4HPos : SV_POSITION; // Projection coord
+ float4 m_v4WPos : POSITION; // World position
+ uint RTIndex : SV_RenderTargetArrayIndex;// Render Target Array Index
+};
+
+ST_GRS_HLSL_GS_IN VSMain(ST_GRS_HLSL_VS_IN stVSInput)
+{
+ ST_GRS_HLSL_GS_IN stVSOutput;
+
+ // 从模型空间转换到世界坐标系
+ stVSOutput.m_v4WPos = mul(stVSInput.m_v4LPos, g_mxWorld);
+
+ return stVSOutput;
+}
+
+[maxvertexcount(18)]
+void GSMain(triangle ST_GRS_HLSL_GS_IN stGSInput[3], inout TriangleStream CubeMapStream)
+{
+ for ( int f = 0; f < GRS_CUBE_MAP_FACE_CNT; ++ f )
+ {
+ ST_GRS_HLSL_GS_OUT stGSOutput;
+
+ stGSOutput.RTIndex = f; //设定输出的缓冲索引
+
+ for (int v = 0; v < 3; v++)
+ {
+ // 下面的乘积是可以优化的,可以提前在 CPP 中 将6个View矩阵分别先与Projection矩阵相乘,再传入Shader
+ // 当然因为这里是固定的Cube
+ stGSOutput.m_v4WPos = stGSInput[v].m_v4WPos;
+ stGSOutput.m_v4HPos = mul(stGSInput[v].m_v4WPos, g_mxGSCubeView[f]);
+ stGSOutput.m_v4HPos = mul(stGSOutput.m_v4HPos, g_mxProj);
+ CubeMapStream.Append(stGSOutput);
+ }
+ CubeMapStream.RestartStrip();
+ }
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/1-3 GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl b/27-IBL-With-Material-Texture/Shader/1-3 GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..2f0e173ce202de8aebfdc120825752bb35d95b75
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/1-3 GRS_HDR_Spherical_Map_2_Cubemap_PS.hlsl
@@ -0,0 +1,16 @@
+#include "0-2 GRS_PBR_Function.hlsli"
+
+Texture2D g_txHDR : register(t0);
+SamplerState g_smpLinear : register(s0);
+
+struct ST_GRS_HLSL_PS_IN
+{
+ float4 m_v4HPos : SV_POSITION; // Projection coord
+ float4 m_v4WPos : POSITION; // World position
+};
+
+float4 PSMain(ST_GRS_HLSL_PS_IN stPSInput) : SV_Target
+{
+ float2 v2UV = SampleSphericalMap(normalize(stPSInput.m_v4WPos.xyz));
+ return float4(g_txHDR.Sample(g_smpLinear, v2UV).rgb, 1.0f);
+}
diff --git a/27-IBL-With-Material-Texture/Shader/2-1 GRS_IBL_Diffuse_Irradiance_Convolution_With_Integration_PS.hlsl b/27-IBL-With-Material-Texture/Shader/2-1 GRS_IBL_Diffuse_Irradiance_Convolution_With_Integration_PS.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..7c3716a57eff881f71fb697183cef25daac7a87d
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/2-1 GRS_IBL_Diffuse_Irradiance_Convolution_With_Integration_PS.hlsl
@@ -0,0 +1,49 @@
+#include "0-2 GRS_PBR_Function.hlsli"
+
+TextureCube g_texHDREnvCubemap : register(t0);
+SamplerState g_sapLinear : register(s0);
+
+struct ST_GRS_HLSL_PS_INPUT
+{
+ float4 m_v4HPos : SV_POSITION;
+ float3 m_v4WPos : POSITION;
+};
+
+float4 PSMain(ST_GRS_HLSL_PS_INPUT pin):SV_Target
+{
+ float3 N = normalize(pin.m_v4WPos.xyz);
+
+ float3 irradiance = float3(0.0f, 0.0f, 0.0f);
+
+ float3 up = float3(0.0f, 1.0f, 0.0f);
+ //float3 right = normalize(cross(N, up));
+ float3 right = normalize(cross(up, N));
+ up = normalize(cross(N, right));
+ //up = normalize(cross(right,N));
+ N = normalize(cross(right,up));
+
+ float nrSamples = 0.0f;
+
+ float deltaPhi = (2.0f * PI) / 180.0f;
+ float deltaTheta = (0.5f * PI) / 90.0f;
+
+ // 卷积运算,直接翻译自公式
+ for (float phi = 0.0f; phi < 2.0f * PI; phi += deltaPhi)
+ {
+ for (float theta = 0.0f; theta < 0.5f * PI; theta += deltaTheta)
+ {
+ // 球坐标转换到笛卡尔坐标(切空间)
+ float3 tangentSample = float3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
+
+ // 切空间转换到世界坐标空间
+ float3 sampleVec = tangentSample.x * right + tangentSample.y * up + tangentSample.z * N;
+ //float3 sampleVec = right;
+ irradiance += (g_texHDREnvCubemap.Sample(g_sapLinear, sampleVec).xyz * cos(theta) * sin(theta));
+
+ nrSamples += 1.0f;
+ }
+ }
+
+ irradiance = PI * irradiance * (1.0 / float(2 * nrSamples));
+ return float4(irradiance, 1.0f);
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/2-2 GRS_IBL_Diffuse_Irradiance_Convolution_With_Monte_Carlo_PS.hlsl b/27-IBL-With-Material-Texture/Shader/2-2 GRS_IBL_Diffuse_Irradiance_Convolution_With_Monte_Carlo_PS.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..2103c504479625ff8de8bb782d76026c99bf952a
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/2-2 GRS_IBL_Diffuse_Irradiance_Convolution_With_Monte_Carlo_PS.hlsl
@@ -0,0 +1,58 @@
+#include "0-2 GRS_PBR_Function.hlsli"
+
+TextureCube g_texHDREnvCubemap : register(t0);
+SamplerState g_sapLinear : register(s0);
+
+struct ST_GRS_HLSL_PS_INPUT
+{
+ float4 m_v4HPos : SV_POSITION;
+ float3 m_v4WPos : POSITION;
+};
+
+float4 PSMain(ST_GRS_HLSL_PS_INPUT stPSInput) :SV_Target
+{
+ float3 N = normalize(stPSInput.m_v4WPos.xyz);
+
+ float3 irradiance = float3(0.0f,0.0f,0.0f);
+
+ // 计算切空间
+ float3 Up = float3(0.0f, 1.0f, 0.0f);
+ float fdot = dot(Up, N);
+ if ((1.0 - fdot) > 1e-6)
+ {
+ Up = float3(1.0f, 0.0f, 0.0f);
+ }
+
+ float3 Right = normalize(cross(Up, N));
+ Up = normalize(cross(N, Right));
+ N = normalize(cross(Right, Up));
+
+ float theta = 0.0f;
+ float phi = 0.0f;
+ float2 Xi;
+ float3 L;
+
+ const uint SAMPLE_NUM = 4096u;
+
+ for (uint i = 0u; i < SAMPLE_NUM; i++)
+ {
+ // 产生均匀分布随机数
+ Xi = Hammersley(i, SAMPLE_NUM);
+
+ // 根据 CDF 反函数计算指定分布的随机变量
+ phi = TWO_PI * Xi.x;
+ theta = asin(sqrt(Xi.y));
+
+ // 球坐标转换到笛卡尔坐标(切空间)
+ L = float3(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
+ // 切空间转换到世界坐标空间
+ L = L.x * Right + L.y * Up + L.z * N;
+
+ // 采样求和统计入射辐照度
+ irradiance += g_texHDREnvCubemap.Sample(g_sapLinear, L).xyz;
+ }
+ // 取平均得到最终结果
+ irradiance *= 1.0 / float(SAMPLE_NUM);
+
+ return float4(irradiance,1.0f);
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/3-1 GRS_IBL_Specular_Pre_Integration_PS.hlsl b/27-IBL-With-Material-Texture/Shader/3-1 GRS_IBL_Specular_Pre_Integration_PS.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..015918f694151c13955781e486939f269d026e5d
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/3-1 GRS_IBL_Specular_Pre_Integration_PS.hlsl
@@ -0,0 +1,59 @@
+#include "0-2 GRS_PBR_Function.hlsli"
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+TextureCube g_texHDREnvCubemap : register(t0);
+SamplerState g_sapLinear : register(s0);
+
+struct ST_GRS_HLSL_PS_INPUT
+{
+ float4 m_v4HPos : SV_POSITION;
+ float3 m_v4WPos : POSITION;
+};
+
+float4 PSMain(ST_GRS_HLSL_PS_INPUT pin) : SV_Target
+{
+ float3 N = normalize(pin.m_v4WPos.xyz);
+ float3 R = N;
+ float3 V = R;
+
+ uint SAMPLE_COUNT = 4096u;
+ float3 prefilteredColor = float3(0.0f, 0.0f, 0.0f);
+ float totalWeight = 0.0f;
+
+ for (uint i = 0; i < SAMPLE_COUNT; ++i)
+ {
+ // 生成均匀分布的无偏序列(Hammersley)
+ float2 Xi = Hammersley(i, SAMPLE_COUNT);
+ // 进行有偏的重要性采样
+ float3 H = ImportanceSampleGGX(Xi, N, g_fRoughness);
+ //float3 H = ImportanceSampleGGX(Xi, N, 0.1f);
+
+ float3 L = normalize(2.0f * dot(V, H) * H - V);
+
+ float NdotL = max(dot(N, L), 0.0f);
+
+ if ( NdotL > 0.0f )
+ {
+ //float D = DistributionGGX(N, H, roughness);
+ //float NdotH = max(dot(N, H), 0.0);
+ //float HdotV = max(dot(H, V), 0.0);
+ //float pdf = D * NdotH / (4.0 * HdotV) + 0.0001;
+
+ //float resolution = 512.0; // resolution of source cubemap (per face)
+ //float saTexel = 4.0 * PI / (6.0 * resolution * resolution);
+ //float saSample = 1.0 / (float(SAMPLE_COUNT) * pdf + 0.0001);
+
+ //float mipLevel = roughness == 0.0 ? 0.0 : 0.5 * log2(saSample / saTexel);
+
+ //prefilteredColor += textureLod(g_texHDREnvCubemap, L, mipLevel).rgb * NdotL;
+ //totalWeight += NdotL;
+
+ prefilteredColor += g_texHDREnvCubemap.Sample(g_sapLinear, L).rgb * NdotL;
+ totalWeight += NdotL;
+ }
+ }
+
+ prefilteredColor = prefilteredColor / totalWeight;
+
+ return float4(prefilteredColor, 1.0f);
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/3-2 GRS_IBL_BRDF_Integration_LUT.hlsl b/27-IBL-With-Material-Texture/Shader/3-2 GRS_IBL_BRDF_Integration_LUT.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..372ce100ac95a43f152036d611ed78e14b30266d
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/3-2 GRS_IBL_BRDF_Integration_LUT.hlsl
@@ -0,0 +1,70 @@
+#include "0-2 GRS_PBR_Function.hlsli"
+
+struct ST_GRS_HLSL_VS_IN
+{
+ float4 m_v4LPos : POSITION;
+ float2 m_v2UV : TEXCOORD;
+};
+
+struct ST_GRS_HLSL_VS_OUT
+{
+ float4 m_v4HPos : SV_POSITION;
+ float2 m_v2UV : TEXCOORD;
+};
+
+ST_GRS_HLSL_VS_OUT VSMain(ST_GRS_HLSL_VS_IN stVSIn)
+{
+ ST_GRS_HLSL_VS_OUT stVSOut = (ST_GRS_HLSL_VS_OUT)0.0f;
+
+ stVSOut.m_v2UV = stVSIn.m_v2UV;
+ //to clip space
+ stVSOut.m_v4HPos = stVSIn.m_v4LPos;
+
+ return stVSOut;
+}
+
+float2 IntegrateBRDF(float NdotV, float roughness)
+{
+ float3 V;
+ V.x = sqrt(1.0f - NdotV * NdotV);
+ V.y = 0.0f;
+ V.z = NdotV;
+
+ float A = 0.0f;
+ float B = 0.0f;
+
+ float3 N = float3(0.0f, 0.0f, 1.0f);
+
+ uint SAMPLE_COUNT = 1024;
+
+ for (uint i = 0; i < SAMPLE_COUNT; ++i)
+ {
+ float2 Xi = Hammersley(i, SAMPLE_COUNT);
+ float3 H = ImportanceSampleGGX(Xi, N, roughness);
+ float3 L = normalize(2.0 * dot(V, H) * H - V);
+
+ float NdotL = max(L.z, 0.0);
+ float NdotH = max(H.z, 0.0);
+ float VdotH = max(dot(V, H), 0.0);
+
+ if (NdotL > 0.0)
+ {
+ float G = GeometrySmith_IBL( NdotV , NdotL , roughness);
+ float G_Vis = ( G * VdotH ) / ( NdotH * NdotV );
+ float Fc = pow(1.0 - VdotH, 5.0);
+
+ A += (1.0 - Fc) * G_Vis;
+ B += Fc * G_Vis;
+ }
+ }
+
+ A /= float(SAMPLE_COUNT);
+ B /= float(SAMPLE_COUNT);
+
+ return float2(A, B);
+}
+
+float2 PSMain(ST_GRS_HLSL_VS_OUT pin) :SV_TARGET
+{
+ return IntegrateBRDF(pin.m_v2UV.x, pin.m_v2UV.y);
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/4-1 GRS_PBR_IBL_VS_Multi_Instance.hlsl b/27-IBL-With-Material-Texture/Shader/4-1 GRS_PBR_IBL_VS_Multi_Instance.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..7bb223b3aa512c1fae8d3b3ba6b46907161b254c
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/4-1 GRS_PBR_IBL_VS_Multi_Instance.hlsl
@@ -0,0 +1,42 @@
+// Multi-Instance PBR IBL Vertex Shader
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+struct ST_GRS_HLSL_PBR_VS_INPUT
+{
+ float4 m_v4LPos : POSITION;
+ float4 m_v4LNormal : NORMAL;
+ float2 m_v2UV : TEXCOORD;
+};
+
+struct ST_GRS_HLSL_PBR_PS_INPUT
+{
+ float4 m_v4HPos : SV_POSITION;
+ float4 m_v4WPos : POSITION;
+ float4 m_v4WNormal : NORMAL;
+ float2 m_v2UV : TEXCOORD;
+};
+
+SamplerState g_sapLinear : register(s0);
+Texture2D g_texDisplacement : register(t2, space1); // 位移贴图(高度图)
+
+ST_GRS_HLSL_PBR_PS_INPUT VSMain(ST_GRS_HLSL_PBR_VS_INPUT stVSInput)
+{
+ ST_GRS_HLSL_PBR_PS_INPUT stVSOutput;
+
+ // 根据位移贴图直接改变物体外形,更好的做法是使用 Tesselation
+ float fDis = (g_texDisplacement.SampleLevel(g_sapLinear, stVSInput.m_v2UV, 0.0f).r * 0.1f);
+ stVSInput.m_v4LPos += fDis * normalize(stVSInput.m_v4LNormal);
+
+ // 局部坐标转换到世界空间和裁剪空间
+ stVSOutput.m_v4WPos = mul(stVSInput.m_v4LPos, g_mxModel2World);
+ stVSOutput.m_v4WPos = mul(stVSOutput.m_v4WPos, g_mxWorld);
+ stVSOutput.m_v4HPos = mul(stVSOutput.m_v4WPos, g_mxVP);
+
+ // 法线先变换到世界坐标系中,再进行世界坐标变换;
+ stVSInput.m_v4LNormal.w = 0.0f;
+ stVSOutput.m_v4WNormal = mul(stVSInput.m_v4LNormal, g_mxModel2World);
+ stVSOutput.m_v4WNormal = normalize(mul(stVSOutput.m_v4WNormal, g_mxWorld));
+ stVSOutput.m_v2UV = stVSInput.m_v2UV;
+
+ return stVSOutput;
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/4-2 GRS_PBR_IBL_PS_Texture.hlsl b/27-IBL-With-Material-Texture/Shader/4-2 GRS_PBR_IBL_PS_Texture.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..bdcf29feba4dfdbaf844d9eae384dd50ca2c894f
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/4-2 GRS_PBR_IBL_PS_Texture.hlsl
@@ -0,0 +1,182 @@
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+#include "0-2 GRS_PBR_Function.hlsli"
+#include "0-1 HDR_COLOR_CONV.hlsli"
+
+SamplerState g_sapLinear : register(s0);
+
+// IBL Lights
+TextureCube g_texSpecularCubemap : register(t0, space0); // 镜面反射
+TextureCube g_texDiffuseCubemap : register(t1, space0); // 漫反射光照
+Texture2D g_texLut : register(t2, space0); // BRDF LUT
+
+// PBR Material
+Texture2D g_texAlbedo : register(t0, space1); // 基础反射率(Base Color or Albedo)
+Texture2D g_texNormal : register(t1, space1); // 法线
+Texture2D g_texDisplacement : register(t2, space1); // 位移贴图(高度图)
+Texture2D g_texMetalness : register(t3, space1); // 金属度
+Texture2D g_texRoughness : register(t4, space1); // 粗糙度
+Texture2D g_texAO : register(t5, space1); // AO
+
+struct ST_GRS_HLSL_PBR_PS_INPUT
+{
+ // Per Vertex Data
+ float4 m_v4HPos : SV_POSITION;
+ float4 m_v4WPos : POSITION;
+ float4 m_v4WNormal : NORMAL;
+ float2 m_v2UV : TEXCOORD;
+};
+
+float3 CalcNewNormal(float2 v2UV, float3 v3Pos, float3 v3OldNormal/*ST_GRS_HLSL_VS_OUTPUT stPSInput*/)
+{
+ float fDisplacementScale = 0.1f;
+ // 水平方向uv的增量
+ float2 v2UVdx = ddx_fine(v2UV);
+ // 垂直方向uv的增量
+ float2 v2UVdy = ddy_fine(v2UV);
+ // 当前置换距离
+ float fHeight = g_texDisplacement.Sample(g_sapLinear, v2UV).r;
+ // 水平方向下一个像素点的置换距离
+ float fHx = g_texDisplacement.Sample(g_sapLinear, v2UV + v2UVdx).r;
+ // 垂直方向下一个像素点的置换距离
+ float fHy = g_texDisplacement.Sample(g_sapLinear, v2UV + v2UVdy).r;
+ // 水平方向置换增量
+ float fHdx = (fHx - fHeight) * fDisplacementScale;
+ // 垂直方向置换增量
+ float fHdy = (fHy - fHeight) * fDisplacementScale;
+
+ // 水平方向顶点坐标增量,作为切线
+ float3 v3Tangent = ddx_fine(v3Pos.xyz);
+ // 垂直方向顶点坐标增量,作为副切线
+ float3 v3BinTangent = ddy_fine(v3Pos.xyz);
+
+ // 到这里为止,其实已经可以用 v3Tangent 差乘 v3BinTangent 来得到 v3NewNormal 了
+ // 但是会发现 v3NewNormal 并不平滑,用来计算光照会出现硬边
+ // 解决办法是使用从 vertex shader 传过来的 normal 来进行纠正,顶点上的 normal 是平滑的
+
+ // corss 部分就是用平滑的 normal 来重新计算新的 v3Tangent
+ // 后面加法是使用置换增量来对其进行扰动
+ float3 v3NewTangent = cross(v3BinTangent, v3OldNormal) + v3OldNormal * fHdx;
+ // 同理
+ float3 v3NewBinTangent = cross(v3OldNormal, v3Tangent) + v3OldNormal * fHdy;
+ // 最终得到平滑的 v3NewNormal
+ float3 v3NewNormal = cross(v3NewTangent, v3NewBinTangent);
+ v3NewNormal = normalize(v3NewNormal);
+
+ // 这里就可以使用这个 v3NewNormal 参与光照计算了
+ return v3NewNormal;
+}
+
+float4 PSMain(ST_GRS_HLSL_PBR_PS_INPUT stPSInput) : SV_TARGET
+{
+ float3 v3Albedo = g_texAlbedo.Sample(g_sapLinear, stPSInput.m_v2UV).rgb;
+ float3 N = g_texNormal.Sample(g_sapLinear, stPSInput.m_v2UV).xyz;
+ float fMetallic = g_texMetalness.Sample(g_sapLinear, stPSInput.m_v2UV).r;
+ float fRoughness = g_texRoughness.Sample(g_sapLinear, stPSInput.m_v2UV).r;
+ float fAO = g_texAO.Sample(g_sapLinear, stPSInput.m_v2UV).r;
+
+ // 法线贴图中取得的法线的标准解算
+ N = 2.0f * N - 1.0f;
+ N = normalize(N);
+
+ // 计算切空间
+ float3 up = float3(0.0f, 1.0f, 0.0f);
+ if (dot(up, stPSInput.m_v4WNormal.xyz) < 1e-6)
+ {
+ up = float3(1.0f, 0.0f, 0.0f);
+ }
+ float3 right = normalize(cross(up, stPSInput.m_v4WNormal.xyz));
+ up = cross(stPSInput.m_v4WNormal.xyz, right);
+
+ // 重新计算逐像素法线
+ N = right * N.x + up * N.y + stPSInput.m_v4WNormal.xyz * N.z;
+
+ //N = CalcNewNormal(stPSInput.m_v2UV, stPSInput.m_v4WPos.xyz, N);
+
+ //return float4(N, 1.0f);
+ //return float4(v3Albedo, 1.0f);
+ //return float4(fMetallic, 0.0f, 0.0f, 1.0f);
+ //return float4(fRoughness, 0.0f, 0.0f, 1.0f);
+ //return float4(fAO, 0.0f, 0.0f, 1.0f);
+
+ // 颜色转换到线性空间(纹理颜色空间本身就是线性空间时,不需要这个转换)
+ //v3Albedo = SRGBToLinear(v3Albedo);
+
+ float3 V = normalize(g_v4EyePos.xyz - stPSInput.m_v4WPos.xyz); // 视向量
+ float3 R = reflect(-V, N); // 视向量的镜面反射向量
+
+ float3 F0 = float3(0.04f, 0.04f, 0.04f);
+ F0 = lerp(F0, v3Albedo, fMetallic);
+
+ float3 Lo = float3(0.0f,0.0f,0.0f);
+
+ float NdotV = max(dot(N, V), 0.0f);
+
+ // 首先按照之前的样子计算直接光照的效果
+ for (int i = 0; i < GRS_LIGHT_COUNT; ++i)
+ {
+ // 计算点光源的照射
+ // 因为是多实例渲染,所以对每个光源做下位置变换,这样相当于每个实例有了自己的光源
+ // 注意这不是标准操作,一定要注意正式的代码中不要这样做
+ float4 v4LightWorldPos = mul(g_v4LightPos[i], g_mxWorld);
+
+ float3 L = v4LightWorldPos.xyz - stPSInput.m_v4WPos.xyz; // 入射光线
+ float distance = length(L);
+ float attenuation = 1.0 / (distance * distance);
+ float3 radiance = g_v4LightColors[i].rgb * attenuation; // 距离平方反比衰减
+
+ L = normalize(L);
+
+ float3 H = normalize(V + L); // 视向量与光线向量的中间向量
+
+ float NdotL = max(dot(N, L), 0.0f);
+
+ // Cook-Torrance BRDF
+ float NDF = DistributionGGX(N, H, fRoughness);
+ float G = GeometrySmith_DirectLight(NdotV ,NdotL , fRoughness);
+ float3 F = FresnelSchlick(NdotV , F0);
+
+ float3 numerator = NDF * G * F;
+ float denominator = 4.0 * NdotV * NdotL + 0.0001; // + 0.0001 to prevent divide by zero
+ float3 specular = numerator / denominator;
+
+ float3 kS = F;
+ float3 kD = float3(1.0f,1.0f,1.0f) - kS;
+ kD *= 1.0 - fMetallic;
+
+ Lo += (kD * v3Albedo / PI + specular) * radiance * NdotL; // note that we already multiplied the BRDF by the Fresnel (kS) so we won't multiply by kS again
+ }
+
+ // 接着开始利用前面的预积分结果计算IBL光照的效果
+
+ // 根据粗糙度插值计算菲涅尔系数(与直接光照的菲涅尔系数计算方法不同)
+ float3 F = FresnelSchlickRoughness(NdotV, F0, fRoughness);
+
+ float3 kS = F;
+ float3 kD = 1.0 - kS;
+ kD *= (1.0 - fMetallic); // 简单但非常重要的计算步骤,表达了纯金属是没有漫反射的
+
+ // IBL漫反射环境光部分
+ float3 irradiance = g_texDiffuseCubemap.Sample(g_sapLinear, N).rgb;
+ float3 diffuse = irradiance * v3Albedo;
+
+ float fCubeWidth = 0.0f;
+ float fCubeHeight = 0.0f;
+ float fCubeMapLevels = 0.0f;
+ // 获取 CubeMap 的 Max Maplevels
+ g_texSpecularCubemap.GetDimensions(0, fCubeWidth, fCubeHeight, fCubeMapLevels);
+ // IBL镜面反射环境光部分
+ float3 prefilteredColor = g_texSpecularCubemap.SampleLevel(g_sapLinear, R, fRoughness * fCubeMapLevels).rgb;
+ float2 brdf = g_texLut.Sample(g_sapLinear, float2(NdotV, fRoughness)).rg;
+ float3 specular = prefilteredColor * (F0 * brdf.x + brdf.y);
+
+ // IBL 光照合成
+ float3 ambient = (kD * diffuse + specular) * fAO;
+
+ // 直接光照 + IBL光照
+ float3 color = ambient + Lo;
+
+ //return float4(color, 1.0f);
+
+ // Gamma
+ return float4(LinearToSRGB(color),1.0f);
+}
\ No newline at end of file
diff --git a/27-IBL-With-Material-Texture/Shader/5-1 GRS_SkyBox_With_Spherical_Map.hlsl b/27-IBL-With-Material-Texture/Shader/5-1 GRS_SkyBox_With_Spherical_Map.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..f2c816f1350fb09610336fa1fdd5c6320383cec3
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/5-1 GRS_SkyBox_With_Spherical_Map.hlsl
@@ -0,0 +1,33 @@
+#include "0-1 HDR_COLOR_CONV.hlsli"
+#include "0-2 GRS_PBR_Function.hlsli"
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+Texture2D g_txSphericalMap : register(t0);
+SamplerState g_smpLinear : register(s0);
+
+struct ST_GRS_HLSL_VS_IN
+{
+ float4 m_v4LPos : POSITION;
+};
+
+struct ST_GRS_HLSL_PS_IN
+{
+ float4 m_v4LPos : SV_POSITION;
+ float4 m_v4PPos : TEXCOORD0;
+};
+
+ST_GRS_HLSL_PS_IN SkyboxVS(ST_GRS_HLSL_VS_IN stVSInput)
+{
+ ST_GRS_HLSL_PS_IN stVSOutput;
+
+ stVSOutput.m_v4LPos = stVSInput.m_v4LPos;
+ stVSOutput.m_v4PPos = normalize(mul(stVSInput.m_v4LPos, g_mxInvVP));
+
+ return stVSOutput;
+}
+
+float4 SkyboxPS(ST_GRS_HLSL_PS_IN stPSInput) : SV_TARGET
+{
+ float2 v2UV = SampleSphericalMap(normalize(stPSInput.m_v4PPos.xyz));
+ return float4(g_txSphericalMap.Sample(g_smpLinear, v2UV).rgb,1.0f);
+}
diff --git a/27-IBL-With-Material-Texture/Shader/5-2 GRS_SkyBox_With_CubeMap.hlsl b/27-IBL-With-Material-Texture/Shader/5-2 GRS_SkyBox_With_CubeMap.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..3e0347d8010991f86beb198ad7f9beda6a0a1412
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/5-2 GRS_SkyBox_With_CubeMap.hlsl
@@ -0,0 +1,32 @@
+#include "0-1 HDR_COLOR_CONV.hlsli"
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+TextureCube g_txCubeMap : register(t0);
+SamplerState g_smpLinear : register(s0);
+
+struct ST_GRS_HLSL_VS_IN
+{
+ float4 m_v4LPos : POSITION;
+};
+
+struct ST_GRS_HLSL_PS_IN
+{
+ float4 m_v4LPos : SV_POSITION;
+ float4 m_v4PPos : TEXCOORD0;
+};
+
+ST_GRS_HLSL_PS_IN SkyboxVS(ST_GRS_HLSL_VS_IN stVSInput)
+{
+ ST_GRS_HLSL_PS_IN stVSOutput;
+
+ stVSOutput.m_v4LPos = stVSInput.m_v4LPos;
+ stVSOutput.m_v4PPos = normalize(mul(stVSInput.m_v4LPos, g_mxInvVP));
+
+ return stVSOutput;
+}
+
+float4 SkyboxPS(ST_GRS_HLSL_PS_IN stPSInput) : SV_TARGET
+{
+ float3 v3SRGBColor = LinearToSRGB(g_txCubeMap.Sample(g_smpLinear, stPSInput.m_v4PPos.xyz).rgb);
+ return float4(v3SRGBColor,1.0f);
+}
diff --git a/27-IBL-With-Material-Texture/Shader/6-1 GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl b/27-IBL-With-Material-Texture/Shader/6-1 GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl
new file mode 100644
index 0000000000000000000000000000000000000000..582b98bb4a5a2962cdc0cf1ac475f00ed127a0bc
--- /dev/null
+++ b/27-IBL-With-Material-Texture/Shader/6-1 GRS_Quad_With_Dynamic_Index_Multi_Instance.hlsl
@@ -0,0 +1,48 @@
+#include "0-1 HDR_COLOR_CONV.hlsli"
+#include "0-3 GRS_Scene_CB_Def.hlsli"
+
+Texture2D g_Texture2DArray[] : register(t0);
+SamplerState g_smpLinear : register(s0);
+
+struct ST_GRS_HLSL_VS_IN
+{
+ float4 m_v4LPosition : POSITION;
+ float4 m_v4Color : COLOR0;
+ float2 m_v2UV : TEXCOORD;
+ float4x4 m_mxQuad2World : WORLD;
+ uint m_nTextureIndex : COLOR1;
+};
+
+struct ST_GRS_HLSL_PS_IN
+{
+ float4 m_v4Position : SV_POSITION;
+ float4 m_v4Color : COLOR0;
+ float2 m_v2UV : TEXCOORD;
+ uint m_nTextureIndex : COLOR1;
+};
+
+ST_GRS_HLSL_PS_IN VSMain( ST_GRS_HLSL_VS_IN stVSInput )
+{
+ ST_GRS_HLSL_PS_IN stVSOutput;
+
+ stVSOutput.m_v4Position = mul(stVSInput.m_v4LPosition, stVSInput.m_mxQuad2World);
+
+ // 下面两句是二选一,一般2D渲染的时候 World 和 View 矩阵都取了单位矩阵,但不排除特殊情况,所以一般还是乘以MVP综合矩阵
+ //stVSOutput.m_v4Position = mul(stVSOutput.m_v4Position, g_mxProj);
+ stVSOutput.m_v4Position = mul(stVSOutput.m_v4Position, g_mxWVP);
+
+ stVSOutput.m_v4Color = stVSInput.m_v4Color;
+ stVSOutput.m_v2UV = stVSInput.m_v2UV;
+ stVSOutput.m_nTextureIndex = stVSInput.m_nTextureIndex;
+
+ return stVSOutput;
+}
+
+float4 PSMain(ST_GRS_HLSL_PS_IN stPSInput) : SV_TARGET
+{
+ //float3 v3SRGBColor
+ //= LinearToSRGB(g_Texture2DArray[stPSInput.m_nTextureIndex].Sample(g_smpLinear, stPSInput.m_v2UV).rgb);
+ //return float4(v3SRGBColor,1.0f);
+
+ return float4(g_Texture2DArray[stPSInput.m_nTextureIndex].Sample(g_smpLinear, stPSInput.m_v2UV).rgb,1.0f);
+}
diff --git a/Assets/PBR6PIC/1-copper-rock1/About these PBR files.txt b/Assets/PBR6PIC/1-copper-rock1/About these PBR files.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0a85e18a6c2e6aa6a6ccae67a0e3f6edb772ee0d
--- /dev/null
+++ b/Assets/PBR6PIC/1-copper-rock1/About these PBR files.txt
@@ -0,0 +1 @@
+These texture files were created by FreePBR.com and may be used freely in your video games and 3d work at no cost. They may not however be redistributed on other websites or anywhere else other than FreePBR.com. We think that is more than fair. :) We also would greatly appreciate it if some sorrt of credit was given if you do indeed use these textures in a published game. Other than that, keep on creating and have fun. :)
\ No newline at end of file
diff --git a/Assets/PBR6PIC/1-copper-rock1/copper-rock1-alb.png b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-alb.png
new file mode 100644
index 0000000000000000000000000000000000000000..a645775984ded4d48419af850ed877990f36085a
Binary files /dev/null and b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-alb.png differ
diff --git a/Assets/PBR6PIC/1-copper-rock1/copper-rock1-ao.png b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-ao.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba4a82b7982cd4e4927b7bc7d8625cbf4058e206
Binary files /dev/null and b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-ao.png differ
diff --git a/Assets/PBR6PIC/1-copper-rock1/copper-rock1-height.png b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-height.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7ba7688f3eeab9aa25e5d6c43060e69f25c7712
Binary files /dev/null and b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-height.png differ
diff --git a/Assets/PBR6PIC/1-copper-rock1/copper-rock1-metal.png b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-metal.png
new file mode 100644
index 0000000000000000000000000000000000000000..9683adc4822e9d780a1d6b6e85f52f198d3751a7
Binary files /dev/null and b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-metal.png differ
diff --git a/Assets/PBR6PIC/1-copper-rock1/copper-rock1-normal.png b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-normal.png
new file mode 100644
index 0000000000000000000000000000000000000000..4aac64b34ebff74fa047f1111bbc26dcf6da8903
Binary files /dev/null and b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-normal.png differ
diff --git a/Assets/PBR6PIC/1-copper-rock1/copper-rock1-rough.png b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-rough.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a84ffe3e0707f031cb3f0bdbf7b4a7901323cc9
Binary files /dev/null and b/Assets/PBR6PIC/1-copper-rock1/copper-rock1-rough.png differ
diff --git a/Assets/PBR6PIC/1-copper-rock1/desktop.ini b/Assets/PBR6PIC/1-copper-rock1/desktop.ini
new file mode 100644
index 0000000000000000000000000000000000000000..dce88a3ef53fa646d38f2c33b56677a812e4dc40
--- /dev/null
+++ b/Assets/PBR6PIC/1-copper-rock1/desktop.ini
@@ -0,0 +1,5 @@
+[.ShellClassInfo]
+InfoTip=This folder is shared online.
+IconFile=C:\Program Files\Google\Drive\googledrivesync.exe
+IconIndex=16
+
\ No newline at end of file
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_albedo.png b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_albedo.png
new file mode 100644
index 0000000000000000000000000000000000000000..63ec9a4603b017fea8035d72863856a9278c9ce8
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_albedo.png differ
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_ao.png b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_ao.png
new file mode 100644
index 0000000000000000000000000000000000000000..8346e6a500a415f899c0837f97f3126ec16a9fac
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_ao.png differ
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_height.png b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_height.png
new file mode 100644
index 0000000000000000000000000000000000000000..bab96c05ece952c0386cee9e9fee88f6286e07ab
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_height.png differ
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_metallic.png b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_metallic.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b014631f4855211a7c1a7cb4dd9708fbd78024f
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_metallic.png differ
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_normal-ogl.png b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_normal-ogl.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0097f6562ec82b84c56c914ba2103f6a0da3b55
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_normal-ogl.png differ
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_preview.jpg b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_preview.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..84286183fa6aa4edd3fbef0278213989751e1e6b
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_preview.jpg differ
diff --git a/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_roughness.png b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_roughness.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdc434d761b1db807f9a984f23f6a331c16fbe69
Binary files /dev/null and b/Assets/PBR6PIC/2-fancy-brass-pattern1/fancy-brass-pattern1_roughness.png differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-albedo.png b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-albedo.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c6e70ce9f4c002f2a08f5ffc9900d9fb5edb89b
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-albedo.png differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-ao.png b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-ao.png
new file mode 100644
index 0000000000000000000000000000000000000000..6cd7d02e4fe80cfd9192c9a2338e19f7ab7c7aeb
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-ao.png differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-height.png b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-height.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b32f7b0a184591637b25ce4b3b6abcbf0455ac0
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-height.png differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-metallic.png b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-metallic.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5c31094bc86a0586e686ad8e7e76914826061c8
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-metallic.png differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-normal-ogl.png b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-normal-ogl.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e9b4872516c1a5c895624a932675778233cf54b
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-normal-ogl.png differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-preview.jpg b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-preview.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b57104686ca649ec3086e4c3bed560120a73d4da
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-preview.jpg differ
diff --git a/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-roughness.png b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-roughness.png
new file mode 100644
index 0000000000000000000000000000000000000000..41d8ea60055e6246f4b5afe82ee8a486ce0a87ba
Binary files /dev/null and b/Assets/PBR6PIC/3-metal-ventilation1/metal-ventilation1-roughness.png differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_albedo.png b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_albedo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e04dd7f2aca40fe6cb47d1b19fc6d95c0c33247
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_albedo.png differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_ao.png b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_ao.png
new file mode 100644
index 0000000000000000000000000000000000000000..9716ec3a53a44dd08dc8a00ff376d9037a056bc1
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_ao.png differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_height.png b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_height.png
new file mode 100644
index 0000000000000000000000000000000000000000..05c82816532ec395447a5b7ef41d7f20a3767f36
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_height.png differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_metallic.png b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_metallic.png
new file mode 100644
index 0000000000000000000000000000000000000000..54cd44f88fe55e5a97eb226350a0a081d300b7a8
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_metallic.png differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_normal-ogl.png b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_normal-ogl.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c2bfeaf7c0c3b06a6f0e96f1eb4dc2d312bb9ee
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_normal-ogl.png differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_preview.jpg b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_preview.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a99ef358bb125064807ea4ba4132daf38956d4be
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_preview.jpg differ
diff --git a/Assets/PBR6PIC/4-pirate-gold/pirate-gold_roughness.png b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_roughness.png
new file mode 100644
index 0000000000000000000000000000000000000000..6878c1c853ab6a8a0e95f57ffacdf7d1352b1e1f
Binary files /dev/null and b/Assets/PBR6PIC/4-pirate-gold/pirate-gold_roughness.png differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_albedo.png b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_albedo.png
new file mode 100644
index 0000000000000000000000000000000000000000..3206d4be2f716969e4f589830cd2f8e540352482
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_albedo.png differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_ao.png b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_ao.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ae532988ec73ef77a058587e16073ae4718806a
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_ao.png differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_height.png b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_height.png
new file mode 100644
index 0000000000000000000000000000000000000000..6acafae274b1c41a0235d9bb42d384aa0896d758
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_height.png differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_metallic.png b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_metallic.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb6ee0aaa2d5fe5639b6a5809ef228bdc8a3f37f
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_metallic.png differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_normal-ogl.png b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_normal-ogl.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4ef1f00426c83a83b5f36e026b10adaad0c916d
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_normal-ogl.png differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_preview.jpg b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_preview.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..7f5067afb8a328b2e8916fe5f2c8fa65a7e9bcdd
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_preview.jpg differ
diff --git a/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_roughness.png b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_roughness.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0c914ed094467b71bf98f78a45927a6290204b1
Binary files /dev/null and b/Assets/PBR6PIC/5-ribbed-chipped-metal/ribbed-chipped-metal_roughness.png differ
diff --git a/Assets/The3DModel/sphere.x b/Assets/The3DModel/sphere.x
new file mode 100644
index 0000000000000000000000000000000000000000..6254781c865df548f0b6f2fba1a4463590bc05f2
--- /dev/null
+++ b/Assets/The3DModel/sphere.x
@@ -0,0 +1,16415 @@
+xof 0303txt 0032
+
+template XSkinMeshHeader {
+ <3cf169ce-ff7c-44ab-93c0-f78f62d172e2>
+ WORD nMaxSkinWeightsPerVertex;
+ WORD nMaxSkinWeightsPerFace;
+ WORD nBones;
+}
+
+template VertexDuplicationIndices {
+
+ DWORD nIndices;
+ DWORD nOriginalVertices;
+ array DWORD indices[nIndices];
+}
+
+template SkinWeights {
+ <6f0d123b-bad2-4167-a0d0-80224f25fabb>
+ STRING transformNodeName;
+ DWORD nWeights;
+ array DWORD vertexIndices[nWeights];
+ array FLOAT weights[nWeights];
+ Matrix4x4 matrixOffset;
+}
+
+
+Frame Frame_SCENE_ROOT {
+
+ FrameTransformMatrix {
+ 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;;
+ }
+
+ Frame Frame1_sphere_lwo_layer1 {
+
+ FrameTransformMatrix {
+ 1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000;;
+ }
+
+ Mesh Mesh_sphere_lwo_Layer1 {
+ 2307;
+ 0.000000;-1.000000;0.000000;,
+ 0.000000;-1.000000;0.000000;,
+ 0.065403;-0.997859;0.000000;,
+ 0.064844;-0.997859;0.008537;,
+ 0.063175;-0.997859;0.016928;,
+ 0.060425;-0.997859;0.025029;,
+ 0.056641;-0.997859;0.032702;,
+ 0.051888;-0.997859;0.039815;,
+ 0.046247;-0.997859;0.046247;,
+ 0.039815;-0.997859;0.051888;,
+ 0.032702;-0.997859;0.056641;,
+ 0.025029;-0.997859;0.060425;,
+ 0.016928;-0.997859;0.063175;,
+ 0.008537;-0.997859;0.064844;,
+ 0.000000;-0.997859;0.065403;,
+ 0.000000;-0.997859;0.065403;,
+ -0.008537;-0.997859;0.064844;,
+ -0.016928;-0.997859;0.063175;,
+ -0.025029;-0.997859;0.060425;,
+ -0.032702;-0.997859;0.056641;,
+ -0.039815;-0.997859;0.051888;,
+ -0.046247;-0.997859;0.046247;,
+ -0.051888;-0.997859;0.039815;,
+ -0.056641;-0.997859;0.032702;,
+ -0.060425;-0.997859;0.025029;,
+ -0.063175;-0.997859;0.016928;,
+ -0.064844;-0.997859;0.008537;,
+ -0.065403;-0.997859;0.000000;,
+ -0.064844;-0.997859;-0.008537;,
+ -0.063175;-0.997859;-0.016928;,
+ -0.060425;-0.997859;-0.025029;,
+ -0.056641;-0.997859;-0.032702;,
+ -0.051888;-0.997859;-0.039815;,
+ -0.046247;-0.997859;-0.046247;,
+ -0.039815;-0.997859;-0.051888;,
+ -0.032702;-0.997859;-0.056641;,
+ -0.025029;-0.997859;-0.060425;,
+ -0.016928;-0.997859;-0.063175;,
+ -0.008537;-0.997859;-0.064844;,
+ 0.000000;-0.997859;-0.065403;,
+ 0.008537;-0.997859;-0.064844;,
+ 0.016928;-0.997859;-0.063175;,
+ 0.025029;-0.997859;-0.060425;,
+ 0.032702;-0.997859;-0.056641;,
+ 0.039815;-0.997859;-0.051888;,
+ 0.046247;-0.997859;-0.046247;,
+ 0.051888;-0.997859;-0.039815;,
+ 0.056641;-0.997859;-0.032702;,
+ 0.060425;-0.997859;-0.025029;,
+ 0.063175;-0.997859;-0.016928;,
+ 0.064844;-0.997859;-0.008537;,
+ 0.130526;-0.991445;0.000000;,
+ 0.129410;-0.991445;0.017037;,
+ 0.126079;-0.991445;0.033783;,
+ 0.120590;-0.991445;0.049950;,
+ 0.113039;-0.991445;0.065263;,
+ 0.103553;-0.991445;0.079459;,
+ 0.092296;-0.991445;0.092296;,
+ 0.079459;-0.991445;0.103553;,
+ 0.065263;-0.991445;0.113039;,
+ 0.049950;-0.991445;0.120590;,
+ 0.033783;-0.991445;0.126079;,
+ 0.017037;-0.991445;0.129410;,
+ 0.000000;-0.991445;0.130526;,
+ 0.000000;-0.991445;0.130526;,
+ -0.017037;-0.991445;0.129410;,
+ -0.033783;-0.991445;0.126079;,
+ -0.049950;-0.991445;0.120590;,
+ -0.065263;-0.991445;0.113039;,
+ -0.079459;-0.991445;0.103553;,
+ -0.092296;-0.991445;0.092296;,
+ -0.103553;-0.991445;0.079459;,
+ -0.113039;-0.991445;0.065263;,
+ -0.120590;-0.991445;0.049950;,
+ -0.126079;-0.991445;0.033783;,
+ -0.129410;-0.991445;0.017037;,
+ -0.130526;-0.991445;0.000000;,
+ -0.129410;-0.991445;-0.017037;,
+ -0.126079;-0.991445;-0.033783;,
+ -0.120590;-0.991445;-0.049950;,
+ -0.113039;-0.991445;-0.065263;,
+ -0.103553;-0.991445;-0.079459;,
+ -0.092296;-0.991445;-0.092296;,
+ -0.079459;-0.991445;-0.103553;,
+ -0.065263;-0.991445;-0.113039;,
+ -0.049950;-0.991445;-0.120590;,
+ -0.033783;-0.991445;-0.126079;,
+ -0.017037;-0.991445;-0.129410;,
+ 0.000000;-0.991445;-0.130526;,
+ 0.017037;-0.991445;-0.129410;,
+ 0.033783;-0.991445;-0.126079;,
+ 0.049950;-0.991445;-0.120590;,
+ 0.065263;-0.991445;-0.113039;,
+ 0.079459;-0.991445;-0.103553;,
+ 0.092296;-0.991445;-0.092296;,
+ 0.103553;-0.991445;-0.079459;,
+ 0.113039;-0.991445;-0.065263;,
+ 0.120590;-0.991445;-0.049950;,
+ 0.126079;-0.991445;-0.033783;,
+ 0.129410;-0.991445;-0.017037;,
+ 0.195090;-0.980785;0.000000;,
+ 0.193421;-0.980785;0.025464;,
+ 0.188443;-0.980785;0.050493;,
+ 0.180240;-0.980785;0.074658;,
+ 0.168953;-0.980785;0.097545;,
+ 0.154776;-0.980785;0.118763;,
+ 0.137950;-0.980785;0.137950;,
+ 0.118763;-0.980785;0.154776;,
+ 0.097545;-0.980785;0.168953;,
+ 0.074658;-0.980785;0.180240;,
+ 0.050493;-0.980785;0.188443;,
+ 0.025464;-0.980785;0.193421;,
+ 0.000000;-0.980785;0.195090;,
+ 0.000000;-0.980785;0.195090;,
+ -0.025464;-0.980785;0.193421;,
+ -0.050493;-0.980785;0.188443;,
+ -0.074658;-0.980785;0.180240;,
+ -0.097545;-0.980785;0.168953;,
+ -0.118763;-0.980785;0.154776;,
+ -0.137950;-0.980785;0.137950;,
+ -0.154776;-0.980785;0.118763;,
+ -0.168953;-0.980785;0.097545;,
+ -0.180240;-0.980785;0.074658;,
+ -0.188443;-0.980785;0.050493;,
+ -0.193421;-0.980785;0.025464;,
+ -0.195090;-0.980785;0.000000;,
+ -0.193421;-0.980785;-0.025464;,
+ -0.188443;-0.980785;-0.050493;,
+ -0.180240;-0.980785;-0.074658;,
+ -0.168953;-0.980785;-0.097545;,
+ -0.154776;-0.980785;-0.118763;,
+ -0.137950;-0.980785;-0.137950;,
+ -0.118763;-0.980785;-0.154776;,
+ -0.097545;-0.980785;-0.168953;,
+ -0.074658;-0.980785;-0.180240;,
+ -0.050493;-0.980785;-0.188443;,
+ -0.025464;-0.980785;-0.193421;,
+ 0.000000;-0.980785;-0.195090;,
+ 0.025464;-0.980785;-0.193421;,
+ 0.050493;-0.980785;-0.188443;,
+ 0.074658;-0.980785;-0.180240;,
+ 0.097545;-0.980785;-0.168953;,
+ 0.118763;-0.980785;-0.154776;,
+ 0.137950;-0.980785;-0.137950;,
+ 0.154776;-0.980785;-0.118763;,
+ 0.168953;-0.980785;-0.097545;,
+ 0.180240;-0.980785;-0.074658;,
+ 0.188443;-0.980785;-0.050493;,
+ 0.193421;-0.980785;-0.025464;,
+ 0.258819;-0.965926;0.000000;,
+ 0.256605;-0.965926;0.033783;,
+ 0.250000;-0.965926;0.066987;,
+ 0.239118;-0.965926;0.099046;,
+ 0.224144;-0.965926;0.129410;,
+ 0.205335;-0.965926;0.157559;,
+ 0.183013;-0.965926;0.183013;,
+ 0.157559;-0.965926;0.205335;,
+ 0.129410;-0.965926;0.224144;,
+ 0.099046;-0.965926;0.239118;,
+ 0.066987;-0.965926;0.250000;,
+ 0.033783;-0.965926;0.256605;,
+ 0.000000;-0.965926;0.258819;,
+ 0.000000;-0.965926;0.258819;,
+ -0.033783;-0.965926;0.256605;,
+ -0.066987;-0.965926;0.250000;,
+ -0.099046;-0.965926;0.239118;,
+ -0.129410;-0.965926;0.224144;,
+ -0.157559;-0.965926;0.205335;,
+ -0.183013;-0.965926;0.183013;,
+ -0.205335;-0.965926;0.157559;,
+ -0.224144;-0.965926;0.129410;,
+ -0.239118;-0.965926;0.099046;,
+ -0.250000;-0.965926;0.066987;,
+ -0.256605;-0.965926;0.033783;,
+ -0.258819;-0.965926;0.000000;,
+ -0.256605;-0.965926;-0.033783;,
+ -0.250000;-0.965926;-0.066987;,
+ -0.239118;-0.965926;-0.099046;,
+ -0.224144;-0.965926;-0.129410;,
+ -0.205335;-0.965926;-0.157559;,
+ -0.183013;-0.965926;-0.183013;,
+ -0.157559;-0.965926;-0.205335;,
+ -0.129410;-0.965926;-0.224144;,
+ -0.099046;-0.965926;-0.239118;,
+ -0.066987;-0.965926;-0.250000;,
+ -0.033783;-0.965926;-0.256605;,
+ 0.000000;-0.965926;-0.258819;,
+ 0.033783;-0.965926;-0.256605;,
+ 0.066987;-0.965926;-0.250000;,
+ 0.099046;-0.965926;-0.239118;,
+ 0.129410;-0.965926;-0.224144;,
+ 0.157559;-0.965926;-0.205335;,
+ 0.183013;-0.965926;-0.183013;,
+ 0.205335;-0.965926;-0.157559;,
+ 0.224144;-0.965926;-0.129410;,
+ 0.239118;-0.965926;-0.099046;,
+ 0.250000;-0.965926;-0.066987;,
+ 0.256605;-0.965926;-0.033783;,
+ 0.321439;-0.946930;0.000000;,
+ 0.318689;-0.946930;0.041956;,
+ 0.310487;-0.946930;0.083195;,
+ 0.296971;-0.946930;0.123010;,
+ 0.278375;-0.946930;0.160720;,
+ 0.255015;-0.946930;0.195680;,
+ 0.227292;-0.946930;0.227292;,
+ 0.195680;-0.946930;0.255015;,
+ 0.160720;-0.946930;0.278375;,
+ 0.123010;-0.946930;0.296971;,
+ 0.083195;-0.946930;0.310487;,
+ 0.041956;-0.946930;0.318689;,
+ 0.000000;-0.946930;0.321439;,
+ 0.000000;-0.946930;0.321439;,
+ -0.041956;-0.946930;0.318689;,
+ -0.083195;-0.946930;0.310487;,
+ -0.123010;-0.946930;0.296971;,
+ -0.160720;-0.946930;0.278375;,
+ -0.195680;-0.946930;0.255015;,
+ -0.227292;-0.946930;0.227292;,
+ -0.255015;-0.946930;0.195680;,
+ -0.278375;-0.946930;0.160720;,
+ -0.296971;-0.946930;0.123010;,
+ -0.310487;-0.946930;0.083195;,
+ -0.318689;-0.946930;0.041956;,
+ -0.321439;-0.946930;0.000000;,
+ -0.318689;-0.946930;-0.041956;,
+ -0.310487;-0.946930;-0.083195;,
+ -0.296971;-0.946930;-0.123010;,
+ -0.278375;-0.946930;-0.160720;,
+ -0.255015;-0.946930;-0.195680;,
+ -0.227292;-0.946930;-0.227292;,
+ -0.195680;-0.946930;-0.255015;,
+ -0.160720;-0.946930;-0.278375;,
+ -0.123010;-0.946930;-0.296971;,
+ -0.083195;-0.946930;-0.310487;,
+ -0.041956;-0.946930;-0.318689;,
+ 0.000000;-0.946930;-0.321439;,
+ 0.041956;-0.946930;-0.318689;,
+ 0.083195;-0.946930;-0.310487;,
+ 0.123010;-0.946930;-0.296971;,
+ 0.160720;-0.946930;-0.278375;,
+ 0.195680;-0.946930;-0.255015;,
+ 0.227292;-0.946930;-0.227292;,
+ 0.255015;-0.946930;-0.195680;,
+ 0.278375;-0.946930;-0.160720;,
+ 0.296971;-0.946930;-0.123010;,
+ 0.310487;-0.946930;-0.083195;,
+ 0.318689;-0.946930;-0.041956;,
+ 0.382683;-0.923880;0.000000;,
+ 0.379410;-0.923880;0.049950;,
+ 0.369644;-0.923880;0.099046;,
+ 0.353553;-0.923880;0.146447;,
+ 0.331414;-0.923880;0.191342;,
+ 0.303603;-0.923880;0.232963;,
+ 0.270598;-0.923880;0.270598;,
+ 0.232963;-0.923880;0.303603;,
+ 0.191342;-0.923880;0.331414;,
+ 0.146447;-0.923880;0.353553;,
+ 0.099046;-0.923880;0.369644;,
+ 0.049950;-0.923880;0.379410;,
+ 0.000000;-0.923880;0.382683;,
+ 0.000000;-0.923880;0.382683;,
+ -0.049950;-0.923880;0.379410;,
+ -0.099046;-0.923880;0.369644;,
+ -0.146447;-0.923880;0.353553;,
+ -0.191342;-0.923880;0.331414;,
+ -0.232963;-0.923880;0.303603;,
+ -0.270598;-0.923880;0.270598;,
+ -0.303603;-0.923880;0.232963;,
+ -0.331414;-0.923880;0.191342;,
+ -0.353553;-0.923880;0.146447;,
+ -0.369644;-0.923880;0.099046;,
+ -0.379410;-0.923880;0.049950;,
+ -0.382683;-0.923880;0.000000;,
+ -0.379410;-0.923880;-0.049950;,
+ -0.369644;-0.923880;-0.099046;,
+ -0.353553;-0.923880;-0.146447;,
+ -0.331414;-0.923880;-0.191342;,
+ -0.303603;-0.923880;-0.232963;,
+ -0.270598;-0.923880;-0.270598;,
+ -0.232963;-0.923880;-0.303603;,
+ -0.191342;-0.923880;-0.331414;,
+ -0.146447;-0.923880;-0.353553;,
+ -0.099046;-0.923880;-0.369644;,
+ -0.049950;-0.923880;-0.379410;,
+ 0.000000;-0.923880;-0.382683;,
+ 0.049950;-0.923880;-0.379410;,
+ 0.099046;-0.923880;-0.369644;,
+ 0.146447;-0.923880;-0.353553;,
+ 0.191342;-0.923880;-0.331414;,
+ 0.232963;-0.923880;-0.303603;,
+ 0.270598;-0.923880;-0.270598;,
+ 0.303603;-0.923880;-0.232963;,
+ 0.331414;-0.923880;-0.191342;,
+ 0.353553;-0.923880;-0.146447;,
+ 0.369644;-0.923880;-0.099046;,
+ 0.379410;-0.923880;-0.049950;,
+ 0.442289;-0.896873;0.000000;,
+ 0.438505;-0.896873;0.057730;,
+ 0.427218;-0.896873;0.114473;,
+ 0.408621;-0.896873;0.169257;,
+ 0.383033;-0.896873;0.221144;,
+ 0.350891;-0.896873;0.269248;,
+ 0.312745;-0.896873;0.312745;,
+ 0.269248;-0.896873;0.350891;,
+ 0.221144;-0.896873;0.383033;,
+ 0.169257;-0.896873;0.408621;,
+ 0.114473;-0.896873;0.427218;,
+ 0.057730;-0.896873;0.438505;,
+ 0.000000;-0.896873;0.442289;,
+ 0.000000;-0.896873;0.442289;,
+ -0.057730;-0.896873;0.438505;,
+ -0.114473;-0.896873;0.427218;,
+ -0.169257;-0.896873;0.408621;,
+ -0.221144;-0.896873;0.383033;,
+ -0.269248;-0.896873;0.350891;,
+ -0.312745;-0.896873;0.312745;,
+ -0.350891;-0.896873;0.269248;,
+ -0.383033;-0.896873;0.221144;,
+ -0.408621;-0.896873;0.169257;,
+ -0.427218;-0.896873;0.114473;,
+ -0.438505;-0.896873;0.057730;,
+ -0.442289;-0.896873;0.000000;,
+ -0.438505;-0.896873;-0.057730;,
+ -0.427218;-0.896873;-0.114473;,
+ -0.408621;-0.896873;-0.169257;,
+ -0.383033;-0.896873;-0.221144;,
+ -0.350891;-0.896873;-0.269248;,
+ -0.312745;-0.896873;-0.312745;,
+ -0.269248;-0.896873;-0.350891;,
+ -0.221144;-0.896873;-0.383033;,
+ -0.169257;-0.896873;-0.408621;,
+ -0.114473;-0.896873;-0.427218;,
+ -0.057730;-0.896873;-0.438505;,
+ 0.000000;-0.896873;-0.442289;,
+ 0.057730;-0.896873;-0.438505;,
+ 0.114473;-0.896873;-0.427218;,
+ 0.169257;-0.896873;-0.408621;,
+ 0.221144;-0.896873;-0.383033;,
+ 0.269248;-0.896873;-0.350891;,
+ 0.312745;-0.896873;-0.312745;,
+ 0.350891;-0.896873;-0.269248;,
+ 0.383033;-0.896873;-0.221144;,
+ 0.408621;-0.896873;-0.169257;,
+ 0.427218;-0.896873;-0.114473;,
+ 0.438505;-0.896873;-0.057730;,
+ 0.500000;-0.866025;0.000000;,
+ 0.495722;-0.866025;0.065263;,
+ 0.482963;-0.866025;0.129410;,
+ 0.461940;-0.866025;0.191342;,
+ 0.433013;-0.866025;0.250000;,
+ 0.396677;-0.866025;0.304381;,
+ 0.353553;-0.866025;0.353553;,
+ 0.304381;-0.866025;0.396677;,
+ 0.250000;-0.866025;0.433013;,
+ 0.191342;-0.866025;0.461940;,
+ 0.129410;-0.866025;0.482963;,
+ 0.065263;-0.866025;0.495722;,
+ 0.000000;-0.866025;0.500000;,
+ 0.000000;-0.866025;0.500000;,
+ -0.065263;-0.866025;0.495722;,
+ -0.129410;-0.866025;0.482963;,
+ -0.191342;-0.866025;0.461940;,
+ -0.250000;-0.866025;0.433013;,
+ -0.304381;-0.866025;0.396677;,
+ -0.353553;-0.866025;0.353553;,
+ -0.396677;-0.866025;0.304381;,
+ -0.433013;-0.866025;0.250000;,
+ -0.461940;-0.866025;0.191342;,
+ -0.482963;-0.866025;0.129410;,
+ -0.495722;-0.866025;0.065263;,
+ -0.500000;-0.866025;0.000000;,
+ -0.495722;-0.866025;-0.065263;,
+ -0.482963;-0.866025;-0.129410;,
+ -0.461940;-0.866025;-0.191342;,
+ -0.433013;-0.866025;-0.250000;,
+ -0.396677;-0.866025;-0.304381;,
+ -0.353553;-0.866025;-0.353553;,
+ -0.304381;-0.866025;-0.396677;,
+ -0.250000;-0.866025;-0.433013;,
+ -0.191342;-0.866025;-0.461940;,
+ -0.129410;-0.866025;-0.482963;,
+ -0.065263;-0.866025;-0.495722;,
+ 0.000000;-0.866025;-0.500000;,
+ 0.065263;-0.866025;-0.495722;,
+ 0.129410;-0.866025;-0.482963;,
+ 0.191342;-0.866025;-0.461940;,
+ 0.250000;-0.866025;-0.433013;,
+ 0.304381;-0.866025;-0.396677;,
+ 0.353553;-0.866025;-0.353553;,
+ 0.396677;-0.866025;-0.304381;,
+ 0.433013;-0.866025;-0.250000;,
+ 0.461940;-0.866025;-0.191342;,
+ 0.482963;-0.866025;-0.129410;,
+ 0.495722;-0.866025;-0.065263;,
+ 0.555570;-0.831470;0.000000;,
+ 0.550817;-0.831470;0.072516;,
+ 0.536640;-0.831470;0.143792;,
+ 0.513280;-0.831470;0.212608;,
+ 0.481138;-0.831470;0.277785;,
+ 0.440764;-0.831470;0.338210;,
+ 0.392847;-0.831470;0.392847;,
+ 0.338210;-0.831470;0.440764;,
+ 0.277785;-0.831470;0.481138;,
+ 0.212608;-0.831470;0.513280;,
+ 0.143792;-0.831470;0.536640;,
+ 0.072516;-0.831470;0.550817;,
+ 0.000000;-0.831470;0.555570;,
+ 0.000000;-0.831470;0.555570;,
+ -0.072516;-0.831470;0.550817;,
+ -0.143792;-0.831470;0.536640;,
+ -0.212608;-0.831470;0.513280;,
+ -0.277785;-0.831470;0.481138;,
+ -0.338210;-0.831470;0.440764;,
+ -0.392847;-0.831470;0.392847;,
+ -0.440764;-0.831470;0.338210;,
+ -0.481138;-0.831470;0.277785;,
+ -0.513280;-0.831470;0.212608;,
+ -0.536640;-0.831470;0.143792;,
+ -0.550817;-0.831470;0.072516;,
+ -0.555570;-0.831470;0.000000;,
+ -0.550817;-0.831470;-0.072516;,
+ -0.536640;-0.831470;-0.143792;,
+ -0.513280;-0.831470;-0.212608;,
+ -0.481138;-0.831470;-0.277785;,
+ -0.440764;-0.831470;-0.338210;,
+ -0.392847;-0.831470;-0.392847;,
+ -0.338210;-0.831470;-0.440764;,
+ -0.277785;-0.831470;-0.481138;,
+ -0.212608;-0.831470;-0.513280;,
+ -0.143792;-0.831470;-0.536640;,
+ -0.072516;-0.831470;-0.550817;,
+ 0.000000;-0.831470;-0.555570;,
+ 0.072516;-0.831470;-0.550817;,
+ 0.143792;-0.831470;-0.536640;,
+ 0.212608;-0.831470;-0.513280;,
+ 0.277785;-0.831470;-0.481138;,
+ 0.338210;-0.831470;-0.440764;,
+ 0.392847;-0.831470;-0.392847;,
+ 0.440764;-0.831470;-0.338210;,
+ 0.481138;-0.831470;-0.277785;,
+ 0.513280;-0.831470;-0.212608;,
+ 0.536640;-0.831470;-0.143792;,
+ 0.550817;-0.831470;-0.072516;,
+ 0.608761;-0.793353;0.000000;,
+ 0.603553;-0.793353;0.079459;,
+ 0.588018;-0.793353;0.157559;,
+ 0.562422;-0.793353;0.232963;,
+ 0.527203;-0.793353;0.304381;,
+ 0.482963;-0.793353;0.370590;,
+ 0.430459;-0.793353;0.430459;,
+ 0.370590;-0.793353;0.482963;,
+ 0.304381;-0.793353;0.527203;,
+ 0.232963;-0.793353;0.562422;,
+ 0.157559;-0.793353;0.588018;,
+ 0.079459;-0.793353;0.603553;,
+ 0.000000;-0.793353;0.608761;,
+ 0.000000;-0.793353;0.608761;,
+ -0.079459;-0.793353;0.603553;,
+ -0.157559;-0.793353;0.588018;,
+ -0.232963;-0.793353;0.562422;,
+ -0.304381;-0.793353;0.527203;,
+ -0.370590;-0.793353;0.482963;,
+ -0.430459;-0.793353;0.430459;,
+ -0.482963;-0.793353;0.370590;,
+ -0.527203;-0.793353;0.304381;,
+ -0.562422;-0.793353;0.232963;,
+ -0.588018;-0.793353;0.157559;,
+ -0.603553;-0.793353;0.079459;,
+ -0.608761;-0.793353;0.000000;,
+ -0.603553;-0.793353;-0.079459;,
+ -0.588018;-0.793353;-0.157559;,
+ -0.562422;-0.793353;-0.232963;,
+ -0.527203;-0.793353;-0.304381;,
+ -0.482963;-0.793353;-0.370590;,
+ -0.430459;-0.793353;-0.430459;,
+ -0.370590;-0.793353;-0.482963;,
+ -0.304381;-0.793353;-0.527203;,
+ -0.232963;-0.793353;-0.562422;,
+ -0.157559;-0.793353;-0.588018;,
+ -0.079459;-0.793353;-0.603553;,
+ 0.000000;-0.793353;-0.608761;,
+ 0.079459;-0.793353;-0.603553;,
+ 0.157559;-0.793353;-0.588018;,
+ 0.232963;-0.793353;-0.562422;,
+ 0.304381;-0.793353;-0.527203;,
+ 0.370590;-0.793353;-0.482963;,
+ 0.430459;-0.793353;-0.430459;,
+ 0.482963;-0.793353;-0.370590;,
+ 0.527203;-0.793353;-0.304381;,
+ 0.562422;-0.793353;-0.232963;,
+ 0.588018;-0.793353;-0.157559;,
+ 0.603553;-0.793353;-0.079459;,
+ 0.659346;-0.751840;0.000000;,
+ 0.653705;-0.751840;0.086062;,
+ 0.636879;-0.751840;0.170651;,
+ 0.609156;-0.751840;0.252321;,
+ 0.571010;-0.751840;0.329673;,
+ 0.523094;-0.751840;0.401384;,
+ 0.466228;-0.751840;0.466228;,
+ 0.401384;-0.751840;0.523094;,
+ 0.329673;-0.751840;0.571010;,
+ 0.252321;-0.751840;0.609156;,
+ 0.170651;-0.751840;0.636879;,
+ 0.086062;-0.751840;0.653705;,
+ 0.000000;-0.751840;0.659346;,
+ 0.000000;-0.751840;0.659346;,
+ -0.086062;-0.751840;0.653705;,
+ -0.170651;-0.751840;0.636879;,
+ -0.252321;-0.751840;0.609156;,
+ -0.329673;-0.751840;0.571010;,
+ -0.401384;-0.751840;0.523094;,
+ -0.466228;-0.751840;0.466228;,
+ -0.523094;-0.751840;0.401384;,
+ -0.571010;-0.751840;0.329673;,
+ -0.609156;-0.751840;0.252321;,
+ -0.636879;-0.751840;0.170651;,
+ -0.653705;-0.751840;0.086062;,
+ -0.659346;-0.751840;0.000000;,
+ -0.653705;-0.751840;-0.086062;,
+ -0.636879;-0.751840;-0.170651;,
+ -0.609156;-0.751840;-0.252321;,
+ -0.571010;-0.751840;-0.329673;,
+ -0.523094;-0.751840;-0.401384;,
+ -0.466228;-0.751840;-0.466228;,
+ -0.401384;-0.751840;-0.523094;,
+ -0.329673;-0.751840;-0.571010;,
+ -0.252321;-0.751840;-0.609156;,
+ -0.170651;-0.751840;-0.636879;,
+ -0.086062;-0.751840;-0.653705;,
+ 0.000000;-0.751840;-0.659346;,
+ 0.086062;-0.751840;-0.653705;,
+ 0.170651;-0.751840;-0.636879;,
+ 0.252321;-0.751840;-0.609156;,
+ 0.329673;-0.751840;-0.571010;,
+ 0.401384;-0.751840;-0.523094;,
+ 0.466228;-0.751840;-0.466228;,
+ 0.523094;-0.751840;-0.401384;,
+ 0.571010;-0.751840;-0.329673;,
+ 0.609156;-0.751840;-0.252321;,
+ 0.636879;-0.751840;-0.170651;,
+ 0.653705;-0.751840;-0.086062;,
+ 0.707107;-0.707107;0.000000;,
+ 0.701057;-0.707107;0.092296;,
+ 0.683013;-0.707107;0.183013;,
+ 0.653282;-0.707107;0.270598;,
+ 0.612372;-0.707107;0.353553;,
+ 0.560986;-0.707107;0.430459;,
+ 0.500000;-0.707107;0.500000;,
+ 0.430459;-0.707107;0.560986;,
+ 0.353553;-0.707107;0.612372;,
+ 0.270598;-0.707107;0.653282;,
+ 0.183013;-0.707107;0.683013;,
+ 0.092296;-0.707107;0.701057;,
+ 0.000000;-0.707107;0.707107;,
+ 0.000000;-0.707107;0.707107;,
+ -0.092296;-0.707107;0.701057;,
+ -0.183013;-0.707107;0.683013;,
+ -0.270598;-0.707107;0.653282;,
+ -0.353553;-0.707107;0.612372;,
+ -0.430459;-0.707107;0.560986;,
+ -0.500000;-0.707107;0.500000;,
+ -0.560986;-0.707107;0.430459;,
+ -0.612372;-0.707107;0.353553;,
+ -0.653282;-0.707107;0.270598;,
+ -0.683013;-0.707107;0.183013;,
+ -0.701057;-0.707107;0.092296;,
+ -0.707107;-0.707107;0.000000;,
+ -0.701057;-0.707107;-0.092296;,
+ -0.683013;-0.707107;-0.183013;,
+ -0.653282;-0.707107;-0.270598;,
+ -0.612372;-0.707107;-0.353553;,
+ -0.560986;-0.707107;-0.430459;,
+ -0.500000;-0.707107;-0.500000;,
+ -0.430459;-0.707107;-0.560986;,
+ -0.353553;-0.707107;-0.612372;,
+ -0.270598;-0.707107;-0.653282;,
+ -0.183013;-0.707107;-0.683013;,
+ -0.092296;-0.707107;-0.701057;,
+ 0.000000;-0.707107;-0.707107;,
+ 0.092296;-0.707107;-0.701057;,
+ 0.183013;-0.707107;-0.683013;,
+ 0.270598;-0.707107;-0.653282;,
+ 0.353553;-0.707107;-0.612372;,
+ 0.430459;-0.707107;-0.560986;,
+ 0.500000;-0.707107;-0.500000;,
+ 0.560986;-0.707107;-0.430459;,
+ 0.612372;-0.707107;-0.353553;,
+ 0.653282;-0.707107;-0.270598;,
+ 0.683013;-0.707107;-0.183013;,
+ 0.701057;-0.707107;-0.092296;,
+ 0.751840;-0.659346;0.000000;,
+ 0.745408;-0.659346;0.098135;,
+ 0.726222;-0.659346;0.194590;,
+ 0.694609;-0.659346;0.287717;,
+ 0.651112;-0.659346;0.375920;,
+ 0.596475;-0.659346;0.457691;,
+ 0.531631;-0.659346;0.531631;,
+ 0.457691;-0.659346;0.596475;,
+ 0.375920;-0.659346;0.651112;,
+ 0.287717;-0.659346;0.694609;,
+ 0.194590;-0.659346;0.726222;,
+ 0.098135;-0.659346;0.745408;,
+ 0.000000;-0.659346;0.751840;,
+ 0.000000;-0.659346;0.751840;,
+ -0.098135;-0.659346;0.745408;,
+ -0.194590;-0.659346;0.726222;,
+ -0.287717;-0.659346;0.694609;,
+ -0.375920;-0.659346;0.651112;,
+ -0.457691;-0.659346;0.596475;,
+ -0.531631;-0.659346;0.531631;,
+ -0.596475;-0.659346;0.457691;,
+ -0.651112;-0.659346;0.375920;,
+ -0.694609;-0.659346;0.287717;,
+ -0.726222;-0.659346;0.194590;,
+ -0.745408;-0.659346;0.098135;,
+ -0.751840;-0.659346;0.000000;,
+ -0.745408;-0.659346;-0.098135;,
+ -0.726222;-0.659346;-0.194590;,
+ -0.694609;-0.659346;-0.287717;,
+ -0.651112;-0.659346;-0.375920;,
+ -0.596475;-0.659346;-0.457691;,
+ -0.531631;-0.659346;-0.531631;,
+ -0.457691;-0.659346;-0.596475;,
+ -0.375920;-0.659346;-0.651112;,
+ -0.287717;-0.659346;-0.694609;,
+ -0.194590;-0.659346;-0.726222;,
+ -0.098135;-0.659346;-0.745408;,
+ 0.000000;-0.659346;-0.751840;,
+ 0.098135;-0.659346;-0.745408;,
+ 0.194590;-0.659346;-0.726222;,
+ 0.287717;-0.659346;-0.694609;,
+ 0.375920;-0.659346;-0.651112;,
+ 0.457691;-0.659346;-0.596475;,
+ 0.531631;-0.659346;-0.531631;,
+ 0.596475;-0.659346;-0.457691;,
+ 0.651112;-0.659346;-0.375920;,
+ 0.694609;-0.659346;-0.287717;,
+ 0.726222;-0.659346;-0.194590;,
+ 0.745408;-0.659346;-0.098135;,
+ 0.793353;-0.608761;0.000000;,
+ 0.786566;-0.608761;0.103553;,
+ 0.766320;-0.608761;0.205335;,
+ 0.732963;-0.608761;0.303603;,
+ 0.687064;-0.608761;0.396677;,
+ 0.629410;-0.608761;0.482963;,
+ 0.560986;-0.608761;0.560986;,
+ 0.482963;-0.608761;0.629410;,
+ 0.396677;-0.608761;0.687064;,
+ 0.303603;-0.608761;0.732963;,
+ 0.205335;-0.608761;0.766320;,
+ 0.103553;-0.608761;0.786566;,
+ 0.000000;-0.608761;0.793353;,
+ 0.000000;-0.608761;0.793353;,
+ -0.103553;-0.608761;0.786566;,
+ -0.205335;-0.608761;0.766320;,
+ -0.303603;-0.608761;0.732963;,
+ -0.396677;-0.608761;0.687064;,
+ -0.482963;-0.608761;0.629410;,
+ -0.560986;-0.608761;0.560986;,
+ -0.629410;-0.608761;0.482963;,
+ -0.687064;-0.608761;0.396677;,
+ -0.732963;-0.608761;0.303603;,
+ -0.766320;-0.608761;0.205335;,
+ -0.786566;-0.608761;0.103553;,
+ -0.793353;-0.608761;0.000000;,
+ -0.786566;-0.608761;-0.103553;,
+ -0.766320;-0.608761;-0.205335;,
+ -0.732963;-0.608761;-0.303603;,
+ -0.687064;-0.608761;-0.396677;,
+ -0.629410;-0.608761;-0.482963;,
+ -0.560986;-0.608761;-0.560986;,
+ -0.482963;-0.608761;-0.629410;,
+ -0.396677;-0.608761;-0.687064;,
+ -0.303603;-0.608761;-0.732963;,
+ -0.205335;-0.608761;-0.766320;,
+ -0.103553;-0.608761;-0.786566;,
+ 0.000000;-0.608761;-0.793353;,
+ 0.103553;-0.608761;-0.786566;,
+ 0.205335;-0.608761;-0.766320;,
+ 0.303603;-0.608761;-0.732963;,
+ 0.396677;-0.608761;-0.687064;,
+ 0.482963;-0.608761;-0.629410;,
+ 0.560986;-0.608761;-0.560986;,
+ 0.629410;-0.608761;-0.482963;,
+ 0.687064;-0.608761;-0.396677;,
+ 0.732963;-0.608761;-0.303603;,
+ 0.766320;-0.608761;-0.205335;,
+ 0.786566;-0.608761;-0.103553;,
+ 0.831470;-0.555570;0.000000;,
+ 0.824356;-0.555570;0.108529;,
+ 0.803138;-0.555570;0.215200;,
+ 0.768178;-0.555570;0.318190;,
+ 0.720074;-0.555570;0.415735;,
+ 0.659649;-0.555570;0.506167;,
+ 0.587938;-0.555570;0.587938;,
+ 0.506167;-0.555570;0.659649;,
+ 0.415735;-0.555570;0.720074;,
+ 0.318190;-0.555570;0.768178;,
+ 0.215200;-0.555570;0.803138;,
+ 0.108529;-0.555570;0.824356;,
+ 0.000000;-0.555570;0.831470;,
+ 0.000000;-0.555570;0.831470;,
+ -0.108529;-0.555570;0.824356;,
+ -0.215200;-0.555570;0.803138;,
+ -0.318190;-0.555570;0.768178;,
+ -0.415735;-0.555570;0.720074;,
+ -0.506167;-0.555570;0.659649;,
+ -0.587938;-0.555570;0.587938;,
+ -0.659649;-0.555570;0.506167;,
+ -0.720074;-0.555570;0.415735;,
+ -0.768178;-0.555570;0.318190;,
+ -0.803138;-0.555570;0.215200;,
+ -0.824356;-0.555570;0.108529;,
+ -0.831470;-0.555570;0.000000;,
+ -0.824356;-0.555570;-0.108529;,
+ -0.803138;-0.555570;-0.215200;,
+ -0.768178;-0.555570;-0.318190;,
+ -0.720074;-0.555570;-0.415735;,
+ -0.659649;-0.555570;-0.506167;,
+ -0.587938;-0.555570;-0.587938;,
+ -0.506167;-0.555570;-0.659649;,
+ -0.415735;-0.555570;-0.720074;,
+ -0.318190;-0.555570;-0.768178;,
+ -0.215200;-0.555570;-0.803138;,
+ -0.108529;-0.555570;-0.824356;,
+ 0.000000;-0.555570;-0.831470;,
+ 0.108529;-0.555570;-0.824356;,
+ 0.215200;-0.555570;-0.803138;,
+ 0.318190;-0.555570;-0.768178;,
+ 0.415735;-0.555570;-0.720074;,
+ 0.506167;-0.555570;-0.659649;,
+ 0.587938;-0.555570;-0.587938;,
+ 0.659649;-0.555570;-0.506167;,
+ 0.720074;-0.555570;-0.415735;,
+ 0.768178;-0.555570;-0.318190;,
+ 0.803138;-0.555570;-0.215200;,
+ 0.824356;-0.555570;-0.108529;,
+ 0.866025;-0.500000;0.000000;,
+ 0.858616;-0.500000;0.113039;,
+ 0.836516;-0.500000;0.224144;,
+ 0.800103;-0.500000;0.331414;,
+ 0.750000;-0.500000;0.433013;,
+ 0.687064;-0.500000;0.527203;,
+ 0.612372;-0.500000;0.612372;,
+ 0.527203;-0.500000;0.687064;,
+ 0.433013;-0.500000;0.750000;,
+ 0.331414;-0.500000;0.800103;,
+ 0.224144;-0.500000;0.836516;,
+ 0.113039;-0.500000;0.858616;,
+ 0.000000;-0.500000;0.866025;,
+ 0.000000;-0.500000;0.866025;,
+ -0.113039;-0.500000;0.858616;,
+ -0.224144;-0.500000;0.836516;,
+ -0.331414;-0.500000;0.800103;,
+ -0.433013;-0.500000;0.750000;,
+ -0.527203;-0.500000;0.687064;,
+ -0.612372;-0.500000;0.612372;,
+ -0.687064;-0.500000;0.527203;,
+ -0.750000;-0.500000;0.433013;,
+ -0.800103;-0.500000;0.331414;,
+ -0.836516;-0.500000;0.224144;,
+ -0.858616;-0.500000;0.113039;,
+ -0.866025;-0.500000;0.000000;,
+ -0.858616;-0.500000;-0.113039;,
+ -0.836516;-0.500000;-0.224144;,
+ -0.800103;-0.500000;-0.331414;,
+ -0.750000;-0.500000;-0.433013;,
+ -0.687064;-0.500000;-0.527203;,
+ -0.612372;-0.500000;-0.612372;,
+ -0.527203;-0.500000;-0.687064;,
+ -0.433013;-0.500000;-0.750000;,
+ -0.331414;-0.500000;-0.800103;,
+ -0.224144;-0.500000;-0.836516;,
+ -0.113039;-0.500000;-0.858616;,
+ 0.000000;-0.500000;-0.866025;,
+ 0.113039;-0.500000;-0.858616;,
+ 0.224144;-0.500000;-0.836516;,
+ 0.331414;-0.500000;-0.800103;,
+ 0.433013;-0.500000;-0.750000;,
+ 0.527203;-0.500000;-0.687064;,
+ 0.612372;-0.500000;-0.612372;,
+ 0.687064;-0.500000;-0.527203;,
+ 0.750000;-0.500000;-0.433013;,
+ 0.800103;-0.500000;-0.331414;,
+ 0.836516;-0.500000;-0.224144;,
+ 0.858616;-0.500000;-0.113039;,
+ 0.896873;-0.442289;0.000000;,
+ 0.889200;-0.442289;0.117065;,
+ 0.866313;-0.442289;0.232128;,
+ 0.828602;-0.442289;0.343218;,
+ 0.776715;-0.442289;0.448436;,
+ 0.711537;-0.442289;0.545982;,
+ 0.634185;-0.442289;0.634185;,
+ 0.545982;-0.442289;0.711537;,
+ 0.448436;-0.442289;0.776715;,
+ 0.343218;-0.442289;0.828602;,
+ 0.232128;-0.442289;0.866313;,
+ 0.117065;-0.442289;0.889200;,
+ 0.000000;-0.442289;0.896873;,
+ 0.000000;-0.442289;0.896873;,
+ -0.117065;-0.442289;0.889200;,
+ -0.232128;-0.442289;0.866313;,
+ -0.343218;-0.442289;0.828602;,
+ -0.448436;-0.442289;0.776715;,
+ -0.545982;-0.442289;0.711537;,
+ -0.634185;-0.442289;0.634185;,
+ -0.711537;-0.442289;0.545982;,
+ -0.776715;-0.442289;0.448436;,
+ -0.828602;-0.442289;0.343218;,
+ -0.866313;-0.442289;0.232128;,
+ -0.889200;-0.442289;0.117065;,
+ -0.896873;-0.442289;0.000000;,
+ -0.889200;-0.442289;-0.117065;,
+ -0.866313;-0.442289;-0.232128;,
+ -0.828602;-0.442289;-0.343218;,
+ -0.776715;-0.442289;-0.448436;,
+ -0.711537;-0.442289;-0.545982;,
+ -0.634185;-0.442289;-0.634185;,
+ -0.545982;-0.442289;-0.711537;,
+ -0.448436;-0.442289;-0.776715;,
+ -0.343218;-0.442289;-0.828602;,
+ -0.232128;-0.442289;-0.866313;,
+ -0.117065;-0.442289;-0.889200;,
+ 0.000000;-0.442289;-0.896873;,
+ 0.117065;-0.442289;-0.889200;,
+ 0.232128;-0.442289;-0.866313;,
+ 0.343218;-0.442289;-0.828602;,
+ 0.448436;-0.442289;-0.776715;,
+ 0.545982;-0.442289;-0.711537;,
+ 0.634185;-0.442289;-0.634185;,
+ 0.711537;-0.442289;-0.545982;,
+ 0.776715;-0.442289;-0.448436;,
+ 0.828602;-0.442289;-0.343218;,
+ 0.866313;-0.442289;-0.232128;,
+ 0.889200;-0.442289;-0.117065;,
+ 0.923880;-0.382683;0.000000;,
+ 0.915976;-0.382683;0.120590;,
+ 0.892399;-0.382683;0.239118;,
+ 0.853553;-0.382683;0.353553;,
+ 0.800103;-0.382683;0.461940;,
+ 0.732963;-0.382683;0.562422;,
+ 0.653282;-0.382683;0.653282;,
+ 0.562422;-0.382683;0.732963;,
+ 0.461940;-0.382683;0.800103;,
+ 0.353553;-0.382683;0.853553;,
+ 0.239118;-0.382683;0.892399;,
+ 0.120590;-0.382683;0.915976;,
+ 0.000000;-0.382683;0.923880;,
+ 0.000000;-0.382683;0.923880;,
+ -0.120590;-0.382683;0.915976;,
+ -0.239118;-0.382683;0.892399;,
+ -0.353553;-0.382683;0.853553;,
+ -0.461940;-0.382683;0.800103;,
+ -0.562422;-0.382683;0.732963;,
+ -0.653282;-0.382683;0.653282;,
+ -0.732963;-0.382683;0.562422;,
+ -0.800103;-0.382683;0.461940;,
+ -0.853553;-0.382683;0.353553;,
+ -0.892399;-0.382683;0.239118;,
+ -0.915976;-0.382683;0.120590;,
+ -0.923880;-0.382683;0.000000;,
+ -0.915976;-0.382683;-0.120590;,
+ -0.892399;-0.382683;-0.239118;,
+ -0.853553;-0.382683;-0.353553;,
+ -0.800103;-0.382683;-0.461940;,
+ -0.732963;-0.382683;-0.562422;,
+ -0.653282;-0.382683;-0.653282;,
+ -0.562422;-0.382683;-0.732963;,
+ -0.461940;-0.382683;-0.800103;,
+ -0.353553;-0.382683;-0.853553;,
+ -0.239118;-0.382683;-0.892399;,
+ -0.120590;-0.382683;-0.915976;,
+ 0.000000;-0.382683;-0.923880;,
+ 0.120590;-0.382683;-0.915976;,
+ 0.239118;-0.382683;-0.892399;,
+ 0.353553;-0.382683;-0.853553;,
+ 0.461940;-0.382683;-0.800103;,
+ 0.562422;-0.382683;-0.732963;,
+ 0.653282;-0.382683;-0.653282;,
+ 0.732963;-0.382683;-0.562422;,
+ 0.800103;-0.382683;-0.461940;,
+ 0.853553;-0.382683;-0.353553;,
+ 0.892399;-0.382683;-0.239118;,
+ 0.915976;-0.382683;-0.120590;,
+ 0.946930;-0.321439;0.000000;,
+ 0.938829;-0.321439;0.123599;,
+ 0.914664;-0.321439;0.245084;,
+ 0.874849;-0.321439;0.362374;,
+ 0.820066;-0.321439;0.473465;,
+ 0.751250;-0.321439;0.576455;,
+ 0.669581;-0.321439;0.669581;,
+ 0.576455;-0.321439;0.751250;,
+ 0.473465;-0.321439;0.820066;,
+ 0.362374;-0.321439;0.874849;,
+ 0.245084;-0.321439;0.914664;,
+ 0.123599;-0.321439;0.938829;,
+ 0.000000;-0.321439;0.946930;,
+ 0.000000;-0.321439;0.946930;,
+ -0.123599;-0.321439;0.938829;,
+ -0.245084;-0.321439;0.914664;,
+ -0.362374;-0.321439;0.874849;,
+ -0.473465;-0.321439;0.820066;,
+ -0.576455;-0.321439;0.751250;,
+ -0.669581;-0.321439;0.669581;,
+ -0.751250;-0.321439;0.576455;,
+ -0.820066;-0.321439;0.473465;,
+ -0.874849;-0.321439;0.362374;,
+ -0.914664;-0.321439;0.245084;,
+ -0.938829;-0.321439;0.123599;,
+ -0.946930;-0.321439;0.000000;,
+ -0.938829;-0.321439;-0.123599;,
+ -0.914664;-0.321439;-0.245084;,
+ -0.874849;-0.321439;-0.362374;,
+ -0.820066;-0.321439;-0.473465;,
+ -0.751250;-0.321439;-0.576455;,
+ -0.669581;-0.321439;-0.669581;,
+ -0.576455;-0.321439;-0.751250;,
+ -0.473465;-0.321439;-0.820066;,
+ -0.362374;-0.321439;-0.874849;,
+ -0.245084;-0.321439;-0.914664;,
+ -0.123599;-0.321439;-0.938829;,
+ 0.000000;-0.321439;-0.946930;,
+ 0.123599;-0.321439;-0.938829;,
+ 0.245084;-0.321439;-0.914664;,
+ 0.362374;-0.321439;-0.874849;,
+ 0.473465;-0.321439;-0.820066;,
+ 0.576455;-0.321439;-0.751250;,
+ 0.669581;-0.321439;-0.669581;,
+ 0.751250;-0.321439;-0.576455;,
+ 0.820066;-0.321439;-0.473465;,
+ 0.874849;-0.321439;-0.362374;,
+ 0.914664;-0.321439;-0.245084;,
+ 0.938829;-0.321439;-0.123599;,
+ 0.965926;-0.258819;0.000000;,
+ 0.957662;-0.258819;0.126079;,
+ 0.933013;-0.258819;0.250000;,
+ 0.892399;-0.258819;0.369644;,
+ 0.836516;-0.258819;0.482963;,
+ 0.766320;-0.258819;0.588018;,
+ 0.683013;-0.258819;0.683013;,
+ 0.588018;-0.258819;0.766320;,
+ 0.482963;-0.258819;0.836516;,
+ 0.369644;-0.258819;0.892399;,
+ 0.250000;-0.258819;0.933013;,
+ 0.126079;-0.258819;0.957662;,
+ 0.000000;-0.258819;0.965926;,
+ 0.000000;-0.258819;0.965926;,
+ -0.126079;-0.258819;0.957662;,
+ -0.250000;-0.258819;0.933013;,
+ -0.369644;-0.258819;0.892399;,
+ -0.482963;-0.258819;0.836516;,
+ -0.588018;-0.258819;0.766320;,
+ -0.683013;-0.258819;0.683013;,
+ -0.766320;-0.258819;0.588018;,
+ -0.836516;-0.258819;0.482963;,
+ -0.892399;-0.258819;0.369644;,
+ -0.933013;-0.258819;0.250000;,
+ -0.957662;-0.258819;0.126079;,
+ -0.965926;-0.258819;0.000000;,
+ -0.957662;-0.258819;-0.126079;,
+ -0.933013;-0.258819;-0.250000;,
+ -0.892399;-0.258819;-0.369644;,
+ -0.836516;-0.258819;-0.482963;,
+ -0.766320;-0.258819;-0.588018;,
+ -0.683013;-0.258819;-0.683013;,
+ -0.588018;-0.258819;-0.766320;,
+ -0.482963;-0.258819;-0.836516;,
+ -0.369644;-0.258819;-0.892399;,
+ -0.250000;-0.258819;-0.933013;,
+ -0.126079;-0.258819;-0.957662;,
+ 0.000000;-0.258819;-0.965926;,
+ 0.126079;-0.258819;-0.957662;,
+ 0.250000;-0.258819;-0.933013;,
+ 0.369644;-0.258819;-0.892399;,
+ 0.482963;-0.258819;-0.836516;,
+ 0.588018;-0.258819;-0.766320;,
+ 0.683013;-0.258819;-0.683013;,
+ 0.766320;-0.258819;-0.588018;,
+ 0.836516;-0.258819;-0.482963;,
+ 0.892399;-0.258819;-0.369644;,
+ 0.933013;-0.258819;-0.250000;,
+ 0.957662;-0.258819;-0.126079;,
+ 0.980785;-0.195090;0.000000;,
+ 0.972395;-0.195090;0.128018;,
+ 0.947366;-0.195090;0.253846;,
+ 0.906127;-0.195090;0.375330;,
+ 0.849385;-0.195090;0.490393;,
+ 0.778109;-0.195090;0.597064;,
+ 0.693520;-0.195090;0.693520;,
+ 0.597064;-0.195090;0.778109;,
+ 0.490393;-0.195090;0.849385;,
+ 0.375330;-0.195090;0.906127;,
+ 0.253846;-0.195090;0.947366;,
+ 0.128018;-0.195090;0.972395;,
+ 0.000000;-0.195090;0.980785;,
+ 0.000000;-0.195090;0.980785;,
+ -0.128018;-0.195090;0.972395;,
+ -0.253846;-0.195090;0.947366;,
+ -0.375330;-0.195090;0.906127;,
+ -0.490393;-0.195090;0.849385;,
+ -0.597064;-0.195090;0.778109;,
+ -0.693520;-0.195090;0.693520;,
+ -0.778109;-0.195090;0.597064;,
+ -0.849385;-0.195090;0.490393;,
+ -0.906127;-0.195090;0.375330;,
+ -0.947366;-0.195090;0.253846;,
+ -0.972395;-0.195090;0.128018;,
+ -0.980785;-0.195090;0.000000;,
+ -0.972395;-0.195090;-0.128018;,
+ -0.947366;-0.195090;-0.253846;,
+ -0.906127;-0.195090;-0.375330;,
+ -0.849385;-0.195090;-0.490393;,
+ -0.778109;-0.195090;-0.597064;,
+ -0.693520;-0.195090;-0.693520;,
+ -0.597064;-0.195090;-0.778109;,
+ -0.490393;-0.195090;-0.849385;,
+ -0.375330;-0.195090;-0.906127;,
+ -0.253846;-0.195090;-0.947366;,
+ -0.128018;-0.195090;-0.972395;,
+ 0.000000;-0.195090;-0.980785;,
+ 0.128018;-0.195090;-0.972395;,
+ 0.253846;-0.195090;-0.947366;,
+ 0.375330;-0.195090;-0.906127;,
+ 0.490393;-0.195090;-0.849385;,
+ 0.597064;-0.195090;-0.778109;,
+ 0.693520;-0.195090;-0.693520;,
+ 0.778109;-0.195090;-0.597064;,
+ 0.849385;-0.195090;-0.490393;,
+ 0.906127;-0.195090;-0.375330;,
+ 0.947366;-0.195090;-0.253846;,
+ 0.972395;-0.195090;-0.128018;,
+ 0.991445;-0.130526;0.000000;,
+ 0.982963;-0.130526;0.129410;,
+ 0.957662;-0.130526;0.256605;,
+ 0.915976;-0.130526;0.379410;,
+ 0.858616;-0.130526;0.495722;,
+ 0.786566;-0.130526;0.603553;,
+ 0.701057;-0.130526;0.701057;,
+ 0.603553;-0.130526;0.786566;,
+ 0.495722;-0.130526;0.858616;,
+ 0.379410;-0.130526;0.915976;,
+ 0.256605;-0.130526;0.957662;,
+ 0.129410;-0.130526;0.982963;,
+ 0.000000;-0.130526;0.991445;,
+ 0.000000;-0.130526;0.991445;,
+ -0.129410;-0.130526;0.982963;,
+ -0.256605;-0.130526;0.957662;,
+ -0.379410;-0.130526;0.915976;,
+ -0.495722;-0.130526;0.858616;,
+ -0.603553;-0.130526;0.786566;,
+ -0.701057;-0.130526;0.701057;,
+ -0.786566;-0.130526;0.603553;,
+ -0.858616;-0.130526;0.495722;,
+ -0.915976;-0.130526;0.379410;,
+ -0.957662;-0.130526;0.256605;,
+ -0.982963;-0.130526;0.129410;,
+ -0.991445;-0.130526;0.000000;,
+ -0.982963;-0.130526;-0.129410;,
+ -0.957662;-0.130526;-0.256605;,
+ -0.915976;-0.130526;-0.379410;,
+ -0.858616;-0.130526;-0.495722;,
+ -0.786566;-0.130526;-0.603553;,
+ -0.701057;-0.130526;-0.701057;,
+ -0.603553;-0.130526;-0.786566;,
+ -0.495722;-0.130526;-0.858616;,
+ -0.379410;-0.130526;-0.915976;,
+ -0.256605;-0.130526;-0.957662;,
+ -0.129410;-0.130526;-0.982963;,
+ 0.000000;-0.130526;-0.991445;,
+ 0.129410;-0.130526;-0.982963;,
+ 0.256605;-0.130526;-0.957662;,
+ 0.379410;-0.130526;-0.915976;,
+ 0.495722;-0.130526;-0.858616;,
+ 0.603553;-0.130526;-0.786566;,
+ 0.701057;-0.130526;-0.701057;,
+ 0.786566;-0.130526;-0.603553;,
+ 0.858616;-0.130526;-0.495722;,
+ 0.915976;-0.130526;-0.379410;,
+ 0.957662;-0.130526;-0.256605;,
+ 0.982963;-0.130526;-0.129410;,
+ 0.997859;-0.065403;0.000000;,
+ 0.989322;-0.065403;0.130247;,
+ 0.963858;-0.065403;0.258265;,
+ 0.921901;-0.065403;0.381864;,
+ 0.864171;-0.065403;0.498929;,
+ 0.791655;-0.065403;0.607458;,
+ 0.705593;-0.065403;0.705593;,
+ 0.607458;-0.065403;0.791655;,
+ 0.498929;-0.065403;0.864171;,
+ 0.381864;-0.065403;0.921901;,
+ 0.258265;-0.065403;0.963858;,
+ 0.130247;-0.065403;0.989322;,
+ 0.000000;-0.065403;0.997859;,
+ 0.000000;-0.065403;0.997859;,
+ -0.130247;-0.065403;0.989322;,
+ -0.258265;-0.065403;0.963858;,
+ -0.381864;-0.065403;0.921901;,
+ -0.498929;-0.065403;0.864171;,
+ -0.607458;-0.065403;0.791655;,
+ -0.705593;-0.065403;0.705593;,
+ -0.791655;-0.065403;0.607458;,
+ -0.864171;-0.065403;0.498929;,
+ -0.921901;-0.065403;0.381864;,
+ -0.963858;-0.065403;0.258265;,
+ -0.989322;-0.065403;0.130247;,
+ -0.997859;-0.065403;0.000000;,
+ -0.989322;-0.065403;-0.130247;,
+ -0.963858;-0.065403;-0.258265;,
+ -0.921901;-0.065403;-0.381864;,
+ -0.864171;-0.065403;-0.498929;,
+ -0.791655;-0.065403;-0.607458;,
+ -0.705593;-0.065403;-0.705593;,
+ -0.607458;-0.065403;-0.791655;,
+ -0.498929;-0.065403;-0.864171;,
+ -0.381864;-0.065403;-0.921901;,
+ -0.258265;-0.065403;-0.963858;,
+ -0.130247;-0.065403;-0.989322;,
+ 0.000000;-0.065403;-0.997859;,
+ 0.130247;-0.065403;-0.989322;,
+ 0.258265;-0.065403;-0.963858;,
+ 0.381864;-0.065403;-0.921901;,
+ 0.498929;-0.065403;-0.864171;,
+ 0.607458;-0.065403;-0.791655;,
+ 0.705593;-0.065403;-0.705593;,
+ 0.791655;-0.065403;-0.607458;,
+ 0.864171;-0.065403;-0.498929;,
+ 0.921901;-0.065403;-0.381864;,
+ 0.963858;-0.065403;-0.258265;,
+ 0.989322;-0.065403;-0.130247;,
+ 1.000000;0.000000;0.000000;,
+ 0.991445;0.000000;0.130526;,
+ 0.965926;0.000000;0.258819;,
+ 0.923880;0.000000;0.382683;,
+ 0.866025;0.000000;0.500000;,
+ 0.793353;0.000000;0.608761;,
+ 0.707107;0.000000;0.707107;,
+ 0.608761;0.000000;0.793353;,
+ 0.500000;0.000000;0.866025;,
+ 0.382683;0.000000;0.923880;,
+ 0.258819;0.000000;0.965926;,
+ 0.130526;0.000000;0.991445;,
+ 0.000000;0.000000;1.000000;,
+ 0.000000;0.000000;1.000000;,
+ -0.130526;0.000000;0.991445;,
+ -0.258819;0.000000;0.965926;,
+ -0.382683;0.000000;0.923880;,
+ -0.500000;0.000000;0.866025;,
+ -0.608761;0.000000;0.793353;,
+ -0.707107;0.000000;0.707107;,
+ -0.793353;0.000000;0.608761;,
+ -0.866025;0.000000;0.500000;,
+ -0.923880;0.000000;0.382683;,
+ -0.965926;0.000000;0.258819;,
+ -0.991445;0.000000;0.130526;,
+ -1.000000;0.000000;0.000000;,
+ -0.991445;0.000000;-0.130526;,
+ -0.965926;0.000000;-0.258819;,
+ -0.923880;0.000000;-0.382683;,
+ -0.866025;0.000000;-0.500000;,
+ -0.793353;0.000000;-0.608761;,
+ -0.707107;0.000000;-0.707107;,
+ -0.608761;0.000000;-0.793353;,
+ -0.500000;0.000000;-0.866025;,
+ -0.382683;0.000000;-0.923880;,
+ -0.258819;0.000000;-0.965926;,
+ -0.130526;0.000000;-0.991445;,
+ 0.000000;0.000000;-1.000000;,
+ 0.130526;0.000000;-0.991445;,
+ 0.258819;0.000000;-0.965926;,
+ 0.382683;0.000000;-0.923880;,
+ 0.500000;0.000000;-0.866025;,
+ 0.608761;0.000000;-0.793353;,
+ 0.707107;0.000000;-0.707107;,
+ 0.793353;0.000000;-0.608761;,
+ 0.866025;0.000000;-0.500000;,
+ 0.923880;0.000000;-0.382683;,
+ 0.965926;0.000000;-0.258819;,
+ 0.991445;0.000000;-0.130526;,
+ 0.997859;0.065403;0.000000;,
+ 0.989322;0.065403;0.130247;,
+ 0.963858;0.065403;0.258265;,
+ 0.921901;0.065403;0.381864;,
+ 0.864171;0.065403;0.498929;,
+ 0.791655;0.065403;0.607458;,
+ 0.705593;0.065403;0.705593;,
+ 0.607458;0.065403;0.791655;,
+ 0.498929;0.065403;0.864171;,
+ 0.381864;0.065403;0.921901;,
+ 0.258265;0.065403;0.963858;,
+ 0.130247;0.065403;0.989322;,
+ 0.000000;0.065403;0.997859;,
+ 0.000000;0.065403;0.997859;,
+ -0.130247;0.065403;0.989322;,
+ -0.258265;0.065403;0.963858;,
+ -0.381864;0.065403;0.921901;,
+ -0.498929;0.065403;0.864171;,
+ -0.607458;0.065403;0.791655;,
+ -0.705593;0.065403;0.705593;,
+ -0.791655;0.065403;0.607458;,
+ -0.864171;0.065403;0.498929;,
+ -0.921901;0.065403;0.381864;,
+ -0.963858;0.065403;0.258265;,
+ -0.989322;0.065403;0.130247;,
+ -0.997859;0.065403;0.000000;,
+ -0.989322;0.065403;-0.130247;,
+ -0.963858;0.065403;-0.258265;,
+ -0.921901;0.065403;-0.381864;,
+ -0.864171;0.065403;-0.498929;,
+ -0.791655;0.065403;-0.607458;,
+ -0.705593;0.065403;-0.705593;,
+ -0.607458;0.065403;-0.791655;,
+ -0.498929;0.065403;-0.864171;,
+ -0.381864;0.065403;-0.921901;,
+ -0.258265;0.065403;-0.963858;,
+ -0.130247;0.065403;-0.989322;,
+ 0.000000;0.065403;-0.997859;,
+ 0.130247;0.065403;-0.989322;,
+ 0.258265;0.065403;-0.963858;,
+ 0.381864;0.065403;-0.921901;,
+ 0.498929;0.065403;-0.864171;,
+ 0.607458;0.065403;-0.791655;,
+ 0.705593;0.065403;-0.705593;,
+ 0.791655;0.065403;-0.607458;,
+ 0.864171;0.065403;-0.498929;,
+ 0.921901;0.065403;-0.381864;,
+ 0.963858;0.065403;-0.258265;,
+ 0.989322;0.065403;-0.130247;,
+ 0.991445;0.130526;0.000000;,
+ 0.982963;0.130526;0.129410;,
+ 0.957662;0.130526;0.256605;,
+ 0.915976;0.130526;0.379410;,
+ 0.858616;0.130526;0.495722;,
+ 0.786566;0.130526;0.603553;,
+ 0.701057;0.130526;0.701057;,
+ 0.603553;0.130526;0.786566;,
+ 0.495722;0.130526;0.858616;,
+ 0.379410;0.130526;0.915976;,
+ 0.256605;0.130526;0.957662;,
+ 0.129410;0.130526;0.982963;,
+ 0.000000;0.130526;0.991445;,
+ 0.000000;0.130526;0.991445;,
+ -0.129410;0.130526;0.982963;,
+ -0.256605;0.130526;0.957662;,
+ -0.379410;0.130526;0.915976;,
+ -0.495722;0.130526;0.858616;,
+ -0.603553;0.130526;0.786566;,
+ -0.701057;0.130526;0.701057;,
+ -0.786566;0.130526;0.603553;,
+ -0.858616;0.130526;0.495722;,
+ -0.915976;0.130526;0.379410;,
+ -0.957662;0.130526;0.256605;,
+ -0.982963;0.130526;0.129410;,
+ -0.991445;0.130526;0.000000;,
+ -0.982963;0.130526;-0.129410;,
+ -0.957662;0.130526;-0.256605;,
+ -0.915976;0.130526;-0.379410;,
+ -0.858616;0.130526;-0.495722;,
+ -0.786566;0.130526;-0.603553;,
+ -0.701057;0.130526;-0.701057;,
+ -0.603553;0.130526;-0.786566;,
+ -0.495722;0.130526;-0.858616;,
+ -0.379410;0.130526;-0.915976;,
+ -0.256605;0.130526;-0.957662;,
+ -0.129410;0.130526;-0.982963;,
+ 0.000000;0.130526;-0.991445;,
+ 0.129410;0.130526;-0.982963;,
+ 0.256605;0.130526;-0.957662;,
+ 0.379410;0.130526;-0.915976;,
+ 0.495722;0.130526;-0.858616;,
+ 0.603553;0.130526;-0.786566;,
+ 0.701057;0.130526;-0.701057;,
+ 0.786566;0.130526;-0.603553;,
+ 0.858616;0.130526;-0.495722;,
+ 0.915976;0.130526;-0.379410;,
+ 0.957662;0.130526;-0.256605;,
+ 0.982963;0.130526;-0.129410;,
+ 0.980785;0.195090;0.000000;,
+ 0.972395;0.195090;0.128018;,
+ 0.947366;0.195090;0.253846;,
+ 0.906127;0.195090;0.375330;,
+ 0.849385;0.195090;0.490393;,
+ 0.778109;0.195090;0.597064;,
+ 0.693520;0.195090;0.693520;,
+ 0.597064;0.195090;0.778109;,
+ 0.490393;0.195090;0.849385;,
+ 0.375330;0.195090;0.906127;,
+ 0.253846;0.195090;0.947366;,
+ 0.128018;0.195090;0.972395;,
+ 0.000000;0.195090;0.980785;,
+ 0.000000;0.195090;0.980785;,
+ -0.128018;0.195090;0.972395;,
+ -0.253846;0.195090;0.947366;,
+ -0.375330;0.195090;0.906127;,
+ -0.490393;0.195090;0.849385;,
+ -0.597064;0.195090;0.778109;,
+ -0.693520;0.195090;0.693520;,
+ -0.778109;0.195090;0.597064;,
+ -0.849385;0.195090;0.490393;,
+ -0.906127;0.195090;0.375330;,
+ -0.947366;0.195090;0.253846;,
+ -0.972395;0.195090;0.128018;,
+ -0.980785;0.195090;0.000000;,
+ -0.972395;0.195090;-0.128018;,
+ -0.947366;0.195090;-0.253846;,
+ -0.906127;0.195090;-0.375330;,
+ -0.849385;0.195090;-0.490393;,
+ -0.778109;0.195090;-0.597064;,
+ -0.693520;0.195090;-0.693520;,
+ -0.597064;0.195090;-0.778109;,
+ -0.490393;0.195090;-0.849385;,
+ -0.375330;0.195090;-0.906127;,
+ -0.253846;0.195090;-0.947366;,
+ -0.128018;0.195090;-0.972395;,
+ 0.000000;0.195090;-0.980785;,
+ 0.128018;0.195090;-0.972395;,
+ 0.253846;0.195090;-0.947366;,
+ 0.375330;0.195090;-0.906127;,
+ 0.490393;0.195090;-0.849385;,
+ 0.597064;0.195090;-0.778109;,
+ 0.693520;0.195090;-0.693520;,
+ 0.778109;0.195090;-0.597064;,
+ 0.849385;0.195090;-0.490393;,
+ 0.906127;0.195090;-0.375330;,
+ 0.947366;0.195090;-0.253846;,
+ 0.972395;0.195090;-0.128018;,
+ 0.965926;0.258819;0.000000;,
+ 0.957662;0.258819;0.126079;,
+ 0.933013;0.258819;0.250000;,
+ 0.892399;0.258819;0.369644;,
+ 0.836516;0.258819;0.482963;,
+ 0.766320;0.258819;0.588018;,
+ 0.683013;0.258819;0.683013;,
+ 0.588018;0.258819;0.766320;,
+ 0.482963;0.258819;0.836516;,
+ 0.369644;0.258819;0.892399;,
+ 0.250000;0.258819;0.933013;,
+ 0.126079;0.258819;0.957662;,
+ 0.000000;0.258819;0.965926;,
+ 0.000000;0.258819;0.965926;,
+ -0.126079;0.258819;0.957662;,
+ -0.250000;0.258819;0.933013;,
+ -0.369644;0.258819;0.892399;,
+ -0.482963;0.258819;0.836516;,
+ -0.588018;0.258819;0.766320;,
+ -0.683013;0.258819;0.683013;,
+ -0.766320;0.258819;0.588018;,
+ -0.836516;0.258819;0.482963;,
+ -0.892399;0.258819;0.369644;,
+ -0.933013;0.258819;0.250000;,
+ -0.957662;0.258819;0.126079;,
+ -0.965926;0.258819;0.000000;,
+ -0.957662;0.258819;-0.126079;,
+ -0.933013;0.258819;-0.250000;,
+ -0.892399;0.258819;-0.369644;,
+ -0.836516;0.258819;-0.482963;,
+ -0.766320;0.258819;-0.588018;,
+ -0.683013;0.258819;-0.683013;,
+ -0.588018;0.258819;-0.766320;,
+ -0.482963;0.258819;-0.836516;,
+ -0.369644;0.258819;-0.892399;,
+ -0.250000;0.258819;-0.933013;,
+ -0.126079;0.258819;-0.957662;,
+ 0.000000;0.258819;-0.965926;,
+ 0.126079;0.258819;-0.957662;,
+ 0.250000;0.258819;-0.933013;,
+ 0.369644;0.258819;-0.892399;,
+ 0.482963;0.258819;-0.836516;,
+ 0.588018;0.258819;-0.766320;,
+ 0.683013;0.258819;-0.683013;,
+ 0.766320;0.258819;-0.588018;,
+ 0.836516;0.258819;-0.482963;,
+ 0.892399;0.258819;-0.369644;,
+ 0.933013;0.258819;-0.250000;,
+ 0.957662;0.258819;-0.126079;,
+ 0.946930;0.321439;0.000000;,
+ 0.938829;0.321439;0.123599;,
+ 0.914664;0.321439;0.245084;,
+ 0.874849;0.321439;0.362374;,
+ 0.820066;0.321439;0.473465;,
+ 0.751250;0.321439;0.576455;,
+ 0.669581;0.321439;0.669581;,
+ 0.576455;0.321439;0.751250;,
+ 0.473465;0.321439;0.820066;,
+ 0.362374;0.321439;0.874849;,
+ 0.245084;0.321439;0.914664;,
+ 0.123599;0.321439;0.938829;,
+ 0.000000;0.321439;0.946930;,
+ 0.000000;0.321439;0.946930;,
+ -0.123599;0.321439;0.938829;,
+ -0.245084;0.321439;0.914664;,
+ -0.362374;0.321439;0.874849;,
+ -0.473465;0.321439;0.820066;,
+ -0.576455;0.321439;0.751250;,
+ -0.669581;0.321439;0.669581;,
+ -0.751250;0.321439;0.576455;,
+ -0.820066;0.321439;0.473465;,
+ -0.874849;0.321439;0.362374;,
+ -0.914664;0.321439;0.245084;,
+ -0.938829;0.321439;0.123599;,
+ -0.946930;0.321439;0.000000;,
+ -0.938829;0.321439;-0.123599;,
+ -0.914664;0.321439;-0.245084;,
+ -0.874849;0.321439;-0.362374;,
+ -0.820066;0.321439;-0.473465;,
+ -0.751250;0.321439;-0.576455;,
+ -0.669581;0.321439;-0.669581;,
+ -0.576455;0.321439;-0.751250;,
+ -0.473465;0.321439;-0.820066;,
+ -0.362374;0.321439;-0.874849;,
+ -0.245084;0.321439;-0.914664;,
+ -0.123599;0.321439;-0.938829;,
+ 0.000000;0.321439;-0.946930;,
+ 0.123599;0.321439;-0.938829;,
+ 0.245084;0.321439;-0.914664;,
+ 0.362374;0.321439;-0.874849;,
+ 0.473465;0.321439;-0.820066;,
+ 0.576455;0.321439;-0.751250;,
+ 0.669581;0.321439;-0.669581;,
+ 0.751250;0.321439;-0.576455;,
+ 0.820066;0.321439;-0.473465;,
+ 0.874849;0.321439;-0.362374;,
+ 0.914664;0.321439;-0.245084;,
+ 0.938829;0.321439;-0.123599;,
+ 0.923880;0.382683;0.000000;,
+ 0.915976;0.382683;0.120590;,
+ 0.892399;0.382683;0.239118;,
+ 0.853553;0.382683;0.353553;,
+ 0.800103;0.382683;0.461940;,
+ 0.732963;0.382683;0.562422;,
+ 0.653282;0.382683;0.653282;,
+ 0.562422;0.382683;0.732963;,
+ 0.461940;0.382683;0.800103;,
+ 0.353553;0.382683;0.853553;,
+ 0.239118;0.382683;0.892399;,
+ 0.120590;0.382683;0.915976;,
+ 0.000000;0.382683;0.923880;,
+ 0.000000;0.382683;0.923880;,
+ -0.120590;0.382683;0.915976;,
+ -0.239118;0.382683;0.892399;,
+ -0.353553;0.382683;0.853553;,
+ -0.461940;0.382683;0.800103;,
+ -0.562422;0.382683;0.732963;,
+ -0.653282;0.382683;0.653282;,
+ -0.732963;0.382683;0.562422;,
+ -0.800103;0.382683;0.461940;,
+ -0.853553;0.382683;0.353553;,
+ -0.892399;0.382683;0.239118;,
+ -0.915976;0.382683;0.120590;,
+ -0.923880;0.382683;0.000000;,
+ -0.915976;0.382683;-0.120590;,
+ -0.892399;0.382683;-0.239118;,
+ -0.853553;0.382683;-0.353553;,
+ -0.800103;0.382683;-0.461940;,
+ -0.732963;0.382683;-0.562422;,
+ -0.653282;0.382683;-0.653282;,
+ -0.562422;0.382683;-0.732963;,
+ -0.461940;0.382683;-0.800103;,
+ -0.353553;0.382683;-0.853553;,
+ -0.239118;0.382683;-0.892399;,
+ -0.120590;0.382683;-0.915976;,
+ 0.000000;0.382683;-0.923880;,
+ 0.120590;0.382683;-0.915976;,
+ 0.239118;0.382683;-0.892399;,
+ 0.353553;0.382683;-0.853553;,
+ 0.461940;0.382683;-0.800103;,
+ 0.562422;0.382683;-0.732963;,
+ 0.653282;0.382683;-0.653282;,
+ 0.732963;0.382683;-0.562422;,
+ 0.800103;0.382683;-0.461940;,
+ 0.853553;0.382683;-0.353553;,
+ 0.892399;0.382683;-0.239118;,
+ 0.915976;0.382683;-0.120590;,
+ 0.896873;0.442289;0.000000;,
+ 0.889200;0.442289;0.117065;,
+ 0.866313;0.442289;0.232128;,
+ 0.828602;0.442289;0.343218;,
+ 0.776715;0.442289;0.448436;,
+ 0.711537;0.442289;0.545982;,
+ 0.634185;0.442289;0.634185;,
+ 0.545982;0.442289;0.711537;,
+ 0.448436;0.442289;0.776715;,
+ 0.343218;0.442289;0.828602;,
+ 0.232128;0.442289;0.866313;,
+ 0.117065;0.442289;0.889200;,
+ 0.000000;0.442289;0.896873;,
+ 0.000000;0.442289;0.896873;,
+ -0.117065;0.442289;0.889200;,
+ -0.232128;0.442289;0.866313;,
+ -0.343218;0.442289;0.828602;,
+ -0.448436;0.442289;0.776715;,
+ -0.545982;0.442289;0.711537;,
+ -0.634185;0.442289;0.634185;,
+ -0.711537;0.442289;0.545982;,
+ -0.776715;0.442289;0.448436;,
+ -0.828602;0.442289;0.343218;,
+ -0.866313;0.442289;0.232128;,
+ -0.889200;0.442289;0.117065;,
+ -0.896873;0.442289;0.000000;,
+ -0.889200;0.442289;-0.117065;,
+ -0.866313;0.442289;-0.232128;,
+ -0.828602;0.442289;-0.343218;,
+ -0.776715;0.442289;-0.448436;,
+ -0.711537;0.442289;-0.545982;,
+ -0.634185;0.442289;-0.634185;,
+ -0.545982;0.442289;-0.711537;,
+ -0.448436;0.442289;-0.776715;,
+ -0.343218;0.442289;-0.828602;,
+ -0.232128;0.442289;-0.866313;,
+ -0.117065;0.442289;-0.889200;,
+ 0.000000;0.442289;-0.896873;,
+ 0.117065;0.442289;-0.889200;,
+ 0.232128;0.442289;-0.866313;,
+ 0.343218;0.442289;-0.828602;,
+ 0.448436;0.442289;-0.776715;,
+ 0.545982;0.442289;-0.711537;,
+ 0.634185;0.442289;-0.634185;,
+ 0.711537;0.442289;-0.545982;,
+ 0.776715;0.442289;-0.448436;,
+ 0.828602;0.442289;-0.343218;,
+ 0.866313;0.442289;-0.232128;,
+ 0.889200;0.442289;-0.117065;,
+ 0.866025;0.500000;0.000000;,
+ 0.858616;0.500000;0.113039;,
+ 0.836516;0.500000;0.224144;,
+ 0.800103;0.500000;0.331414;,
+ 0.750000;0.500000;0.433013;,
+ 0.687064;0.500000;0.527203;,
+ 0.612372;0.500000;0.612372;,
+ 0.527203;0.500000;0.687064;,
+ 0.433013;0.500000;0.750000;,
+ 0.331414;0.500000;0.800103;,
+ 0.224144;0.500000;0.836516;,
+ 0.113039;0.500000;0.858616;,
+ 0.000000;0.500000;0.866025;,
+ 0.000000;0.500000;0.866025;,
+ -0.113039;0.500000;0.858616;,
+ -0.224144;0.500000;0.836516;,
+ -0.331414;0.500000;0.800103;,
+ -0.433013;0.500000;0.750000;,
+ -0.527203;0.500000;0.687064;,
+ -0.612372;0.500000;0.612372;,
+ -0.687064;0.500000;0.527203;,
+ -0.750000;0.500000;0.433013;,
+ -0.800103;0.500000;0.331414;,
+ -0.836516;0.500000;0.224144;,
+ -0.858616;0.500000;0.113039;,
+ -0.866025;0.500000;0.000000;,
+ -0.858616;0.500000;-0.113039;,
+ -0.836516;0.500000;-0.224144;,
+ -0.800103;0.500000;-0.331414;,
+ -0.750000;0.500000;-0.433013;,
+ -0.687064;0.500000;-0.527203;,
+ -0.612372;0.500000;-0.612372;,
+ -0.527203;0.500000;-0.687064;,
+ -0.433013;0.500000;-0.750000;,
+ -0.331414;0.500000;-0.800103;,
+ -0.224144;0.500000;-0.836516;,
+ -0.113039;0.500000;-0.858616;,
+ 0.000000;0.500000;-0.866025;,
+ 0.113039;0.500000;-0.858616;,
+ 0.224144;0.500000;-0.836516;,
+ 0.331414;0.500000;-0.800103;,
+ 0.433013;0.500000;-0.750000;,
+ 0.527203;0.500000;-0.687064;,
+ 0.612372;0.500000;-0.612372;,
+ 0.687064;0.500000;-0.527203;,
+ 0.750000;0.500000;-0.433013;,
+ 0.800103;0.500000;-0.331414;,
+ 0.836516;0.500000;-0.224144;,
+ 0.858616;0.500000;-0.113039;,
+ 0.831470;0.555570;0.000000;,
+ 0.824356;0.555570;0.108529;,
+ 0.803138;0.555570;0.215200;,
+ 0.768178;0.555570;0.318190;,
+ 0.720074;0.555570;0.415735;,
+ 0.659649;0.555570;0.506167;,
+ 0.587938;0.555570;0.587938;,
+ 0.506167;0.555570;0.659649;,
+ 0.415735;0.555570;0.720074;,
+ 0.318190;0.555570;0.768178;,
+ 0.215200;0.555570;0.803138;,
+ 0.108529;0.555570;0.824356;,
+ 0.000000;0.555570;0.831470;,
+ 0.000000;0.555570;0.831470;,
+ -0.108529;0.555570;0.824356;,
+ -0.215200;0.555570;0.803138;,
+ -0.318190;0.555570;0.768178;,
+ -0.415735;0.555570;0.720074;,
+ -0.506167;0.555570;0.659649;,
+ -0.587938;0.555570;0.587938;,
+ -0.659649;0.555570;0.506167;,
+ -0.720074;0.555570;0.415735;,
+ -0.768178;0.555570;0.318190;,
+ -0.803138;0.555570;0.215200;,
+ -0.824356;0.555570;0.108529;,
+ -0.831470;0.555570;0.000000;,
+ -0.824356;0.555570;-0.108529;,
+ -0.803138;0.555570;-0.215200;,
+ -0.768178;0.555570;-0.318190;,
+ -0.720074;0.555570;-0.415735;,
+ -0.659649;0.555570;-0.506167;,
+ -0.587938;0.555570;-0.587938;,
+ -0.506167;0.555570;-0.659649;,
+ -0.415735;0.555570;-0.720074;,
+ -0.318190;0.555570;-0.768178;,
+ -0.215200;0.555570;-0.803138;,
+ -0.108529;0.555570;-0.824356;,
+ 0.000000;0.555570;-0.831470;,
+ 0.108529;0.555570;-0.824356;,
+ 0.215200;0.555570;-0.803138;,
+ 0.318190;0.555570;-0.768178;,
+ 0.415735;0.555570;-0.720074;,
+ 0.506167;0.555570;-0.659649;,
+ 0.587938;0.555570;-0.587938;,
+ 0.659649;0.555570;-0.506167;,
+ 0.720074;0.555570;-0.415735;,
+ 0.768178;0.555570;-0.318190;,
+ 0.803138;0.555570;-0.215200;,
+ 0.824356;0.555570;-0.108529;,
+ 0.793353;0.608761;0.000000;,
+ 0.786566;0.608761;0.103553;,
+ 0.766320;0.608761;0.205335;,
+ 0.732963;0.608761;0.303603;,
+ 0.687064;0.608761;0.396677;,
+ 0.629410;0.608761;0.482963;,
+ 0.560986;0.608761;0.560986;,
+ 0.482963;0.608761;0.629410;,
+ 0.396677;0.608761;0.687064;,
+ 0.303603;0.608761;0.732963;,
+ 0.205335;0.608761;0.766320;,
+ 0.103553;0.608761;0.786566;,
+ 0.000000;0.608761;0.793353;,
+ 0.000000;0.608761;0.793353;,
+ -0.103553;0.608761;0.786566;,
+ -0.205335;0.608761;0.766320;,
+ -0.303603;0.608761;0.732963;,
+ -0.396677;0.608761;0.687064;,
+ -0.482963;0.608761;0.629410;,
+ -0.560986;0.608761;0.560986;,
+ -0.629410;0.608761;0.482963;,
+ -0.687064;0.608761;0.396677;,
+ -0.732963;0.608761;0.303603;,
+ -0.766320;0.608761;0.205335;,
+ -0.786566;0.608761;0.103553;,
+ -0.793353;0.608761;0.000000;,
+ -0.786566;0.608761;-0.103553;,
+ -0.766320;0.608761;-0.205335;,
+ -0.732963;0.608761;-0.303603;,
+ -0.687064;0.608761;-0.396677;,
+ -0.629410;0.608761;-0.482963;,
+ -0.560986;0.608761;-0.560986;,
+ -0.482963;0.608761;-0.629410;,
+ -0.396677;0.608761;-0.687064;,
+ -0.303603;0.608761;-0.732963;,
+ -0.205335;0.608761;-0.766320;,
+ -0.103553;0.608761;-0.786566;,
+ 0.000000;0.608761;-0.793353;,
+ 0.103553;0.608761;-0.786566;,
+ 0.205335;0.608761;-0.766320;,
+ 0.303603;0.608761;-0.732963;,
+ 0.396677;0.608761;-0.687064;,
+ 0.482963;0.608761;-0.629410;,
+ 0.560986;0.608761;-0.560986;,
+ 0.629410;0.608761;-0.482963;,
+ 0.687064;0.608761;-0.396677;,
+ 0.732963;0.608761;-0.303603;,
+ 0.766320;0.608761;-0.205335;,
+ 0.786566;0.608761;-0.103553;,
+ 0.751840;0.659346;0.000000;,
+ 0.745408;0.659346;0.098135;,
+ 0.726222;0.659346;0.194590;,
+ 0.694609;0.659346;0.287717;,
+ 0.651112;0.659346;0.375920;,
+ 0.596475;0.659346;0.457691;,
+ 0.531631;0.659346;0.531631;,
+ 0.457691;0.659346;0.596475;,
+ 0.375920;0.659346;0.651112;,
+ 0.287717;0.659346;0.694609;,
+ 0.194590;0.659346;0.726222;,
+ 0.098135;0.659346;0.745408;,
+ 0.000000;0.659346;0.751840;,
+ 0.000000;0.659346;0.751840;,
+ -0.098135;0.659346;0.745408;,
+ -0.194590;0.659346;0.726222;,
+ -0.287717;0.659346;0.694609;,
+ -0.375920;0.659346;0.651112;,
+ -0.457691;0.659346;0.596475;,
+ -0.531631;0.659346;0.531631;,
+ -0.596475;0.659346;0.457691;,
+ -0.651112;0.659346;0.375920;,
+ -0.694609;0.659346;0.287717;,
+ -0.726222;0.659346;0.194590;,
+ -0.745408;0.659346;0.098135;,
+ -0.751840;0.659346;0.000000;,
+ -0.745408;0.659346;-0.098135;,
+ -0.726222;0.659346;-0.194590;,
+ -0.694609;0.659346;-0.287717;,
+ -0.651112;0.659346;-0.375920;,
+ -0.596475;0.659346;-0.457691;,
+ -0.531631;0.659346;-0.531631;,
+ -0.457691;0.659346;-0.596475;,
+ -0.375920;0.659346;-0.651112;,
+ -0.287717;0.659346;-0.694609;,
+ -0.194590;0.659346;-0.726222;,
+ -0.098135;0.659346;-0.745408;,
+ 0.000000;0.659346;-0.751840;,
+ 0.098135;0.659346;-0.745408;,
+ 0.194590;0.659346;-0.726222;,
+ 0.287717;0.659346;-0.694609;,
+ 0.375920;0.659346;-0.651112;,
+ 0.457691;0.659346;-0.596475;,
+ 0.531631;0.659346;-0.531631;,
+ 0.596475;0.659346;-0.457691;,
+ 0.651112;0.659346;-0.375920;,
+ 0.694609;0.659346;-0.287717;,
+ 0.726222;0.659346;-0.194590;,
+ 0.745408;0.659346;-0.098135;,
+ 0.707107;0.707107;0.000000;,
+ 0.701057;0.707107;0.092296;,
+ 0.683013;0.707107;0.183013;,
+ 0.653282;0.707107;0.270598;,
+ 0.612372;0.707107;0.353553;,
+ 0.560986;0.707107;0.430459;,
+ 0.500000;0.707107;0.500000;,
+ 0.430459;0.707107;0.560986;,
+ 0.353553;0.707107;0.612372;,
+ 0.270598;0.707107;0.653282;,
+ 0.183013;0.707107;0.683013;,
+ 0.092296;0.707107;0.701057;,
+ 0.000000;0.707107;0.707107;,
+ 0.000000;0.707107;0.707107;,
+ -0.092296;0.707107;0.701057;,
+ -0.183013;0.707107;0.683013;,
+ -0.270598;0.707107;0.653282;,
+ -0.353553;0.707107;0.612372;,
+ -0.430459;0.707107;0.560986;,
+ -0.500000;0.707107;0.500000;,
+ -0.560986;0.707107;0.430459;,
+ -0.612372;0.707107;0.353553;,
+ -0.653282;0.707107;0.270598;,
+ -0.683013;0.707107;0.183013;,
+ -0.701057;0.707107;0.092296;,
+ -0.707107;0.707107;0.000000;,
+ -0.701057;0.707107;-0.092296;,
+ -0.683013;0.707107;-0.183013;,
+ -0.653282;0.707107;-0.270598;,
+ -0.612372;0.707107;-0.353553;,
+ -0.560986;0.707107;-0.430459;,
+ -0.500000;0.707107;-0.500000;,
+ -0.430459;0.707107;-0.560986;,
+ -0.353553;0.707107;-0.612372;,
+ -0.270598;0.707107;-0.653282;,
+ -0.183013;0.707107;-0.683013;,
+ -0.092296;0.707107;-0.701057;,
+ 0.000000;0.707107;-0.707107;,
+ 0.092296;0.707107;-0.701057;,
+ 0.183013;0.707107;-0.683013;,
+ 0.270598;0.707107;-0.653282;,
+ 0.353553;0.707107;-0.612372;,
+ 0.430459;0.707107;-0.560986;,
+ 0.500000;0.707107;-0.500000;,
+ 0.560986;0.707107;-0.430459;,
+ 0.612372;0.707107;-0.353553;,
+ 0.653282;0.707107;-0.270598;,
+ 0.683013;0.707107;-0.183013;,
+ 0.701057;0.707107;-0.092296;,
+ 0.659346;0.751840;0.000000;,
+ 0.653705;0.751840;0.086062;,
+ 0.636879;0.751840;0.170651;,
+ 0.609156;0.751840;0.252321;,
+ 0.571010;0.751840;0.329673;,
+ 0.523094;0.751840;0.401384;,
+ 0.466228;0.751840;0.466228;,
+ 0.401384;0.751840;0.523094;,
+ 0.329673;0.751840;0.571010;,
+ 0.252321;0.751840;0.609156;,
+ 0.170651;0.751840;0.636879;,
+ 0.086062;0.751840;0.653705;,
+ 0.000000;0.751840;0.659346;,
+ 0.000000;0.751840;0.659346;,
+ -0.086062;0.751840;0.653705;,
+ -0.170651;0.751840;0.636879;,
+ -0.252321;0.751840;0.609156;,
+ -0.329673;0.751840;0.571010;,
+ -0.401384;0.751840;0.523094;,
+ -0.466228;0.751840;0.466228;,
+ -0.523094;0.751840;0.401384;,
+ -0.571010;0.751840;0.329673;,
+ -0.609156;0.751840;0.252321;,
+ -0.636879;0.751840;0.170651;,
+ -0.653705;0.751840;0.086062;,
+ -0.659346;0.751840;0.000000;,
+ -0.653705;0.751840;-0.086062;,
+ -0.636879;0.751840;-0.170651;,
+ -0.609156;0.751840;-0.252321;,
+ -0.571010;0.751840;-0.329673;,
+ -0.523094;0.751840;-0.401384;,
+ -0.466228;0.751840;-0.466228;,
+ -0.401384;0.751840;-0.523094;,
+ -0.329673;0.751840;-0.571010;,
+ -0.252321;0.751840;-0.609156;,
+ -0.170651;0.751840;-0.636879;,
+ -0.086062;0.751840;-0.653705;,
+ 0.000000;0.751840;-0.659346;,
+ 0.086062;0.751840;-0.653705;,
+ 0.170651;0.751840;-0.636879;,
+ 0.252321;0.751840;-0.609156;,
+ 0.329673;0.751840;-0.571010;,
+ 0.401384;0.751840;-0.523094;,
+ 0.466228;0.751840;-0.466228;,
+ 0.523094;0.751840;-0.401384;,
+ 0.571010;0.751840;-0.329673;,
+ 0.609156;0.751840;-0.252321;,
+ 0.636879;0.751840;-0.170651;,
+ 0.653705;0.751840;-0.086062;,
+ 0.608761;0.793353;0.000000;,
+ 0.603553;0.793353;0.079459;,
+ 0.588018;0.793353;0.157559;,
+ 0.562422;0.793353;0.232963;,
+ 0.527203;0.793353;0.304381;,
+ 0.482963;0.793353;0.370590;,
+ 0.430459;0.793353;0.430459;,
+ 0.370590;0.793353;0.482963;,
+ 0.304381;0.793353;0.527203;,
+ 0.232963;0.793353;0.562422;,
+ 0.157559;0.793353;0.588018;,
+ 0.079459;0.793353;0.603553;,
+ 0.000000;0.793353;0.608761;,
+ 0.000000;0.793353;0.608761;,
+ -0.079459;0.793353;0.603553;,
+ -0.157559;0.793353;0.588018;,
+ -0.232963;0.793353;0.562422;,
+ -0.304381;0.793353;0.527203;,
+ -0.370590;0.793353;0.482963;,
+ -0.430459;0.793353;0.430459;,
+ -0.482963;0.793353;0.370590;,
+ -0.527203;0.793353;0.304381;,
+ -0.562422;0.793353;0.232963;,
+ -0.588018;0.793353;0.157559;,
+ -0.603553;0.793353;0.079459;,
+ -0.608761;0.793353;0.000000;,
+ -0.603553;0.793353;-0.079459;,
+ -0.588018;0.793353;-0.157559;,
+ -0.562422;0.793353;-0.232963;,
+ -0.527203;0.793353;-0.304381;,
+ -0.482963;0.793353;-0.370590;,
+ -0.430459;0.793353;-0.430459;,
+ -0.370590;0.793353;-0.482963;,
+ -0.304381;0.793353;-0.527203;,
+ -0.232963;0.793353;-0.562422;,
+ -0.157559;0.793353;-0.588018;,
+ -0.079459;0.793353;-0.603553;,
+ 0.000000;0.793353;-0.608761;,
+ 0.079459;0.793353;-0.603553;,
+ 0.157559;0.793353;-0.588018;,
+ 0.232963;0.793353;-0.562422;,
+ 0.304381;0.793353;-0.527203;,
+ 0.370590;0.793353;-0.482963;,
+ 0.430459;0.793353;-0.430459;,
+ 0.482963;0.793353;-0.370590;,
+ 0.527203;0.793353;-0.304381;,
+ 0.562422;0.793353;-0.232963;,
+ 0.588018;0.793353;-0.157559;,
+ 0.603553;0.793353;-0.079459;,
+ 0.555570;0.831470;0.000000;,
+ 0.550817;0.831470;0.072516;,
+ 0.536640;0.831470;0.143792;,
+ 0.513280;0.831470;0.212608;,
+ 0.481138;0.831470;0.277785;,
+ 0.440764;0.831470;0.338210;,
+ 0.392847;0.831470;0.392847;,
+ 0.338210;0.831470;0.440764;,
+ 0.277785;0.831470;0.481138;,
+ 0.212608;0.831470;0.513280;,
+ 0.143792;0.831470;0.536640;,
+ 0.072516;0.831470;0.550817;,
+ 0.000000;0.831470;0.555570;,
+ 0.000000;0.831470;0.555570;,
+ -0.072516;0.831470;0.550817;,
+ -0.143792;0.831470;0.536640;,
+ -0.212608;0.831470;0.513280;,
+ -0.277785;0.831470;0.481138;,
+ -0.338210;0.831470;0.440764;,
+ -0.392847;0.831470;0.392847;,
+ -0.440764;0.831470;0.338210;,
+ -0.481138;0.831470;0.277785;,
+ -0.513280;0.831470;0.212608;,
+ -0.536640;0.831470;0.143792;,
+ -0.550817;0.831470;0.072516;,
+ -0.555570;0.831470;0.000000;,
+ -0.550817;0.831470;-0.072516;,
+ -0.536640;0.831470;-0.143792;,
+ -0.513280;0.831470;-0.212608;,
+ -0.481138;0.831470;-0.277785;,
+ -0.440764;0.831470;-0.338210;,
+ -0.392847;0.831470;-0.392847;,
+ -0.338210;0.831470;-0.440764;,
+ -0.277785;0.831470;-0.481138;,
+ -0.212608;0.831470;-0.513280;,
+ -0.143792;0.831470;-0.536640;,
+ -0.072516;0.831470;-0.550817;,
+ 0.000000;0.831470;-0.555570;,
+ 0.072516;0.831470;-0.550817;,
+ 0.143792;0.831470;-0.536640;,
+ 0.212608;0.831470;-0.513280;,
+ 0.277785;0.831470;-0.481138;,
+ 0.338210;0.831470;-0.440764;,
+ 0.392847;0.831470;-0.392847;,
+ 0.440764;0.831470;-0.338210;,
+ 0.481138;0.831470;-0.277785;,
+ 0.513280;0.831470;-0.212608;,
+ 0.536640;0.831470;-0.143792;,
+ 0.550817;0.831470;-0.072516;,
+ 0.500000;0.866025;0.000000;,
+ 0.495722;0.866025;0.065263;,
+ 0.482963;0.866025;0.129410;,
+ 0.461940;0.866025;0.191342;,
+ 0.433013;0.866025;0.250000;,
+ 0.396677;0.866025;0.304381;,
+ 0.353553;0.866025;0.353553;,
+ 0.304381;0.866025;0.396677;,
+ 0.250000;0.866025;0.433013;,
+ 0.191342;0.866025;0.461940;,
+ 0.129410;0.866025;0.482963;,
+ 0.065263;0.866025;0.495722;,
+ 0.000000;0.866025;0.500000;,
+ 0.000000;0.866025;0.500000;,
+ -0.065263;0.866025;0.495722;,
+ -0.129410;0.866025;0.482963;,
+ -0.191342;0.866025;0.461940;,
+ -0.250000;0.866025;0.433013;,
+ -0.304381;0.866025;0.396677;,
+ -0.353553;0.866025;0.353553;,
+ -0.396677;0.866025;0.304381;,
+ -0.433013;0.866025;0.250000;,
+ -0.461940;0.866025;0.191342;,
+ -0.482963;0.866025;0.129410;,
+ -0.495722;0.866025;0.065263;,
+ -0.500000;0.866025;0.000000;,
+ -0.495722;0.866025;-0.065263;,
+ -0.482963;0.866025;-0.129410;,
+ -0.461940;0.866025;-0.191342;,
+ -0.433013;0.866025;-0.250000;,
+ -0.396677;0.866025;-0.304381;,
+ -0.353553;0.866025;-0.353553;,
+ -0.304381;0.866025;-0.396677;,
+ -0.250000;0.866025;-0.433013;,
+ -0.191342;0.866025;-0.461940;,
+ -0.129410;0.866025;-0.482963;,
+ -0.065263;0.866025;-0.495722;,
+ 0.000000;0.866025;-0.500000;,
+ 0.065263;0.866025;-0.495722;,
+ 0.129410;0.866025;-0.482963;,
+ 0.191342;0.866025;-0.461940;,
+ 0.250000;0.866025;-0.433013;,
+ 0.304381;0.866025;-0.396677;,
+ 0.353553;0.866025;-0.353553;,
+ 0.396677;0.866025;-0.304381;,
+ 0.433013;0.866025;-0.250000;,
+ 0.461940;0.866025;-0.191342;,
+ 0.482963;0.866025;-0.129410;,
+ 0.495722;0.866025;-0.065263;,
+ 0.442289;0.896873;0.000000;,
+ 0.438505;0.896873;0.057730;,
+ 0.427218;0.896873;0.114473;,
+ 0.408621;0.896873;0.169257;,
+ 0.383033;0.896873;0.221144;,
+ 0.350891;0.896873;0.269248;,
+ 0.312745;0.896873;0.312745;,
+ 0.269248;0.896873;0.350891;,
+ 0.221144;0.896873;0.383033;,
+ 0.169257;0.896873;0.408621;,
+ 0.114473;0.896873;0.427218;,
+ 0.057730;0.896873;0.438505;,
+ 0.000000;0.896873;0.442289;,
+ 0.000000;0.896873;0.442289;,
+ -0.057730;0.896873;0.438505;,
+ -0.114473;0.896873;0.427218;,
+ -0.169257;0.896873;0.408621;,
+ -0.221144;0.896873;0.383033;,
+ -0.269248;0.896873;0.350891;,
+ -0.312745;0.896873;0.312745;,
+ -0.350891;0.896873;0.269248;,
+ -0.383033;0.896873;0.221144;,
+ -0.408621;0.896873;0.169257;,
+ -0.427218;0.896873;0.114473;,
+ -0.438505;0.896873;0.057730;,
+ -0.442289;0.896873;0.000000;,
+ -0.438505;0.896873;-0.057730;,
+ -0.427218;0.896873;-0.114473;,
+ -0.408621;0.896873;-0.169257;,
+ -0.383033;0.896873;-0.221144;,
+ -0.350891;0.896873;-0.269248;,
+ -0.312745;0.896873;-0.312745;,
+ -0.269248;0.896873;-0.350891;,
+ -0.221144;0.896873;-0.383033;,
+ -0.169257;0.896873;-0.408621;,
+ -0.114473;0.896873;-0.427218;,
+ -0.057730;0.896873;-0.438505;,
+ 0.000000;0.896873;-0.442289;,
+ 0.057730;0.896873;-0.438505;,
+ 0.114473;0.896873;-0.427218;,
+ 0.169257;0.896873;-0.408621;,
+ 0.221144;0.896873;-0.383033;,
+ 0.269248;0.896873;-0.350891;,
+ 0.312745;0.896873;-0.312745;,
+ 0.350891;0.896873;-0.269248;,
+ 0.383033;0.896873;-0.221144;,
+ 0.408621;0.896873;-0.169257;,
+ 0.427218;0.896873;-0.114473;,
+ 0.438505;0.896873;-0.057730;,
+ 0.382683;0.923880;0.000000;,
+ 0.379410;0.923880;0.049950;,
+ 0.369644;0.923880;0.099046;,
+ 0.353553;0.923880;0.146447;,
+ 0.331414;0.923880;0.191342;,
+ 0.303603;0.923880;0.232963;,
+ 0.270598;0.923880;0.270598;,
+ 0.232963;0.923880;0.303603;,
+ 0.191342;0.923880;0.331414;,
+ 0.146447;0.923880;0.353553;,
+ 0.099046;0.923880;0.369644;,
+ 0.049950;0.923880;0.379410;,
+ 0.000000;0.923880;0.382683;,
+ 0.000000;0.923880;0.382683;,
+ -0.049950;0.923880;0.379410;,
+ -0.099046;0.923880;0.369644;,
+ -0.146447;0.923880;0.353553;,
+ -0.191342;0.923880;0.331414;,
+ -0.232963;0.923880;0.303603;,
+ -0.270598;0.923880;0.270598;,
+ -0.303603;0.923880;0.232963;,
+ -0.331414;0.923880;0.191342;,
+ -0.353553;0.923880;0.146447;,
+ -0.369644;0.923880;0.099046;,
+ -0.379410;0.923880;0.049950;,
+ -0.382683;0.923880;0.000000;,
+ -0.379410;0.923880;-0.049950;,
+ -0.369644;0.923880;-0.099046;,
+ -0.353553;0.923880;-0.146447;,
+ -0.331414;0.923880;-0.191342;,
+ -0.303603;0.923880;-0.232963;,
+ -0.270598;0.923880;-0.270598;,
+ -0.232963;0.923880;-0.303603;,
+ -0.191342;0.923880;-0.331414;,
+ -0.146447;0.923880;-0.353553;,
+ -0.099046;0.923880;-0.369644;,
+ -0.049950;0.923880;-0.379410;,
+ 0.000000;0.923880;-0.382683;,
+ 0.049950;0.923880;-0.379410;,
+ 0.099046;0.923880;-0.369644;,
+ 0.146447;0.923880;-0.353553;,
+ 0.191342;0.923880;-0.331414;,
+ 0.232963;0.923880;-0.303603;,
+ 0.270598;0.923880;-0.270598;,
+ 0.303603;0.923880;-0.232963;,
+ 0.331414;0.923880;-0.191342;,
+ 0.353553;0.923880;-0.146447;,
+ 0.369644;0.923880;-0.099046;,
+ 0.379410;0.923880;-0.049950;,
+ 0.321439;0.946930;0.000000;,
+ 0.318689;0.946930;0.041956;,
+ 0.310487;0.946930;0.083195;,
+ 0.296971;0.946930;0.123010;,
+ 0.278375;0.946930;0.160720;,
+ 0.255015;0.946930;0.195680;,
+ 0.227292;0.946930;0.227292;,
+ 0.195680;0.946930;0.255015;,
+ 0.160720;0.946930;0.278375;,
+ 0.123010;0.946930;0.296971;,
+ 0.083195;0.946930;0.310487;,
+ 0.041956;0.946930;0.318689;,
+ 0.000000;0.946930;0.321439;,
+ 0.000000;0.946930;0.321439;,
+ -0.041956;0.946930;0.318689;,
+ -0.083195;0.946930;0.310487;,
+ -0.123010;0.946930;0.296971;,
+ -0.160720;0.946930;0.278375;,
+ -0.195680;0.946930;0.255015;,
+ -0.227292;0.946930;0.227292;,
+ -0.255015;0.946930;0.195680;,
+ -0.278375;0.946930;0.160720;,
+ -0.296971;0.946930;0.123010;,
+ -0.310487;0.946930;0.083195;,
+ -0.318689;0.946930;0.041956;,
+ -0.321439;0.946930;0.000000;,
+ -0.318689;0.946930;-0.041956;,
+ -0.310487;0.946930;-0.083195;,
+ -0.296971;0.946930;-0.123010;,
+ -0.278375;0.946930;-0.160720;,
+ -0.255015;0.946930;-0.195680;,
+ -0.227292;0.946930;-0.227292;,
+ -0.195680;0.946930;-0.255015;,
+ -0.160720;0.946930;-0.278375;,
+ -0.123010;0.946930;-0.296971;,
+ -0.083195;0.946930;-0.310487;,
+ -0.041956;0.946930;-0.318689;,
+ 0.000000;0.946930;-0.321439;,
+ 0.041956;0.946930;-0.318689;,
+ 0.083195;0.946930;-0.310487;,
+ 0.123010;0.946930;-0.296971;,
+ 0.160720;0.946930;-0.278375;,
+ 0.195680;0.946930;-0.255015;,
+ 0.227292;0.946930;-0.227292;,
+ 0.255015;0.946930;-0.195680;,
+ 0.278375;0.946930;-0.160720;,
+ 0.296971;0.946930;-0.123010;,
+ 0.310487;0.946930;-0.083195;,
+ 0.318689;0.946930;-0.041956;,
+ 0.258819;0.965926;0.000000;,
+ 0.256605;0.965926;0.033783;,
+ 0.250000;0.965926;0.066987;,
+ 0.239118;0.965926;0.099046;,
+ 0.224144;0.965926;0.129410;,
+ 0.205335;0.965926;0.157559;,
+ 0.183013;0.965926;0.183013;,
+ 0.157559;0.965926;0.205335;,
+ 0.129410;0.965926;0.224144;,
+ 0.099046;0.965926;0.239118;,
+ 0.066987;0.965926;0.250000;,
+ 0.033783;0.965926;0.256605;,
+ 0.000000;0.965926;0.258819;,
+ 0.000000;0.965926;0.258819;,
+ -0.033783;0.965926;0.256605;,
+ -0.066987;0.965926;0.250000;,
+ -0.099046;0.965926;0.239118;,
+ -0.129410;0.965926;0.224144;,
+ -0.157559;0.965926;0.205335;,
+ -0.183013;0.965926;0.183013;,
+ -0.205335;0.965926;0.157559;,
+ -0.224144;0.965926;0.129410;,
+ -0.239118;0.965926;0.099046;,
+ -0.250000;0.965926;0.066987;,
+ -0.256605;0.965926;0.033783;,
+ -0.258819;0.965926;0.000000;,
+ -0.256605;0.965926;-0.033783;,
+ -0.250000;0.965926;-0.066987;,
+ -0.239118;0.965926;-0.099046;,
+ -0.224144;0.965926;-0.129410;,
+ -0.205335;0.965926;-0.157559;,
+ -0.183013;0.965926;-0.183013;,
+ -0.157559;0.965926;-0.205335;,
+ -0.129410;0.965926;-0.224144;,
+ -0.099046;0.965926;-0.239118;,
+ -0.066987;0.965926;-0.250000;,
+ -0.033783;0.965926;-0.256605;,
+ 0.000000;0.965926;-0.258819;,
+ 0.033783;0.965926;-0.256605;,
+ 0.066987;0.965926;-0.250000;,
+ 0.099046;0.965926;-0.239118;,
+ 0.129410;0.965926;-0.224144;,
+ 0.157559;0.965926;-0.205335;,
+ 0.183013;0.965926;-0.183013;,
+ 0.205335;0.965926;-0.157559;,
+ 0.224144;0.965926;-0.129410;,
+ 0.239118;0.965926;-0.099046;,
+ 0.250000;0.965926;-0.066987;,
+ 0.256605;0.965926;-0.033783;,
+ 0.195090;0.980785;0.000000;,
+ 0.193421;0.980785;0.025464;,
+ 0.188443;0.980785;0.050493;,
+ 0.180240;0.980785;0.074658;,
+ 0.168953;0.980785;0.097545;,
+ 0.154776;0.980785;0.118763;,
+ 0.137950;0.980785;0.137950;,
+ 0.118763;0.980785;0.154776;,
+ 0.097545;0.980785;0.168953;,
+ 0.074658;0.980785;0.180240;,
+ 0.050493;0.980785;0.188443;,
+ 0.025464;0.980785;0.193421;,
+ 0.000000;0.980785;0.195090;,
+ 0.000000;0.980785;0.195090;,
+ -0.025464;0.980785;0.193421;,
+ -0.050493;0.980785;0.188443;,
+ -0.074658;0.980785;0.180240;,
+ -0.097545;0.980785;0.168953;,
+ -0.118763;0.980785;0.154776;,
+ -0.137950;0.980785;0.137950;,
+ -0.154776;0.980785;0.118763;,
+ -0.168953;0.980785;0.097545;,
+ -0.180240;0.980785;0.074658;,
+ -0.188443;0.980785;0.050493;,
+ -0.193421;0.980785;0.025464;,
+ -0.195090;0.980785;0.000000;,
+ -0.193421;0.980785;-0.025464;,
+ -0.188443;0.980785;-0.050493;,
+ -0.180240;0.980785;-0.074658;,
+ -0.168953;0.980785;-0.097545;,
+ -0.154776;0.980785;-0.118763;,
+ -0.137950;0.980785;-0.137950;,
+ -0.118763;0.980785;-0.154776;,
+ -0.097545;0.980785;-0.168953;,
+ -0.074658;0.980785;-0.180240;,
+ -0.050493;0.980785;-0.188443;,
+ -0.025464;0.980785;-0.193421;,
+ 0.000000;0.980785;-0.195090;,
+ 0.025464;0.980785;-0.193421;,
+ 0.050493;0.980785;-0.188443;,
+ 0.074658;0.980785;-0.180240;,
+ 0.097545;0.980785;-0.168953;,
+ 0.118763;0.980785;-0.154776;,
+ 0.137950;0.980785;-0.137950;,
+ 0.154776;0.980785;-0.118763;,
+ 0.168953;0.980785;-0.097545;,
+ 0.180240;0.980785;-0.074658;,
+ 0.188443;0.980785;-0.050493;,
+ 0.193421;0.980785;-0.025464;,
+ 0.130526;0.991445;0.000000;,
+ 0.129410;0.991445;0.017037;,
+ 0.126079;0.991445;0.033783;,
+ 0.120590;0.991445;0.049950;,
+ 0.113039;0.991445;0.065263;,
+ 0.103553;0.991445;0.079459;,
+ 0.092296;0.991445;0.092296;,
+ 0.079459;0.991445;0.103553;,
+ 0.065263;0.991445;0.113039;,
+ 0.049950;0.991445;0.120590;,
+ 0.033783;0.991445;0.126079;,
+ 0.017037;0.991445;0.129410;,
+ 0.000000;0.991445;0.130526;,
+ 0.000000;0.991445;0.130526;,
+ -0.017037;0.991445;0.129410;,
+ -0.033783;0.991445;0.126079;,
+ -0.049950;0.991445;0.120590;,
+ -0.065263;0.991445;0.113039;,
+ -0.079459;0.991445;0.103553;,
+ -0.092296;0.991445;0.092296;,
+ -0.103553;0.991445;0.079459;,
+ -0.113039;0.991445;0.065263;,
+ -0.120590;0.991445;0.049950;,
+ -0.126079;0.991445;0.033783;,
+ -0.129410;0.991445;0.017037;,
+ -0.130526;0.991445;0.000000;,
+ -0.129410;0.991445;-0.017037;,
+ -0.126079;0.991445;-0.033783;,
+ -0.120590;0.991445;-0.049950;,
+ -0.113039;0.991445;-0.065263;,
+ -0.103553;0.991445;-0.079459;,
+ -0.092296;0.991445;-0.092296;,
+ -0.079459;0.991445;-0.103553;,
+ -0.065263;0.991445;-0.113039;,
+ -0.049950;0.991445;-0.120590;,
+ -0.033783;0.991445;-0.126079;,
+ -0.017037;0.991445;-0.129410;,
+ 0.000000;0.991445;-0.130526;,
+ 0.017037;0.991445;-0.129410;,
+ 0.033783;0.991445;-0.126079;,
+ 0.049950;0.991445;-0.120590;,
+ 0.065263;0.991445;-0.113039;,
+ 0.079459;0.991445;-0.103553;,
+ 0.092296;0.991445;-0.092296;,
+ 0.103553;0.991445;-0.079459;,
+ 0.113039;0.991445;-0.065263;,
+ 0.120590;0.991445;-0.049950;,
+ 0.126079;0.991445;-0.033783;,
+ 0.129410;0.991445;-0.017037;,
+ 0.065403;0.997859;0.000000;,
+ 0.064844;0.997859;0.008537;,
+ 0.063175;0.997859;0.016928;,
+ 0.060425;0.997859;0.025029;,
+ 0.056641;0.997859;0.032702;,
+ 0.051888;0.997859;0.039815;,
+ 0.046247;0.997859;0.046247;,
+ 0.039815;0.997859;0.051888;,
+ 0.032702;0.997859;0.056641;,
+ 0.025029;0.997859;0.060425;,
+ 0.016928;0.997859;0.063175;,
+ 0.008537;0.997859;0.064844;,
+ 0.000000;0.997859;0.065403;,
+ 0.000000;0.997859;0.065403;,
+ -0.008537;0.997859;0.064844;,
+ -0.016928;0.997859;0.063175;,
+ -0.025029;0.997859;0.060425;,
+ -0.032702;0.997859;0.056641;,
+ -0.039815;0.997859;0.051888;,
+ -0.046247;0.997859;0.046247;,
+ -0.051888;0.997859;0.039815;,
+ -0.056641;0.997859;0.032702;,
+ -0.060425;0.997859;0.025029;,
+ -0.063175;0.997859;0.016928;,
+ -0.064844;0.997859;0.008537;,
+ -0.065403;0.997859;0.000000;,
+ -0.064844;0.997859;-0.008537;,
+ -0.063175;0.997859;-0.016928;,
+ -0.060425;0.997859;-0.025029;,
+ -0.056641;0.997859;-0.032702;,
+ -0.051888;0.997859;-0.039815;,
+ -0.046247;0.997859;-0.046247;,
+ -0.039815;0.997859;-0.051888;,
+ -0.032702;0.997859;-0.056641;,
+ -0.025029;0.997859;-0.060425;,
+ -0.016928;0.997859;-0.063175;,
+ -0.008537;0.997859;-0.064844;,
+ 0.000000;0.997859;-0.065403;,
+ 0.008537;0.997859;-0.064844;,
+ 0.016928;0.997859;-0.063175;,
+ 0.025029;0.997859;-0.060425;,
+ 0.032702;0.997859;-0.056641;,
+ 0.039815;0.997859;-0.051888;,
+ 0.046247;0.997859;-0.046247;,
+ 0.051888;0.997859;-0.039815;,
+ 0.056641;0.997859;-0.032702;,
+ 0.060425;0.997859;-0.025029;,
+ 0.063175;0.997859;-0.016928;,
+ 0.064844;0.997859;-0.008537;,
+ 0.000000;1.000000;0.000000;,
+ 0.000000;1.000000;0.000000;;
+ 2304;
+ 3;2304,2305,2256;,
+ 3;0,3,4;,
+ 3;0,4,5;,
+ 3;0,5,6;,
+ 3;0,6,7;,
+ 3;0,7,8;,
+ 3;0,8,9;,
+ 3;0,9,10;,
+ 3;0,10,11;,
+ 3;0,11,12;,
+ 3;0,12,13;,
+ 3;0,13,14;,
+ 3;1,15,16;,
+ 3;1,16,17;,
+ 3;1,17,18;,
+ 3;1,18,19;,
+ 3;1,19,20;,
+ 3;1,20,21;,
+ 3;1,21,22;,
+ 3;1,22,23;,
+ 3;1,23,24;,
+ 3;1,24,25;,
+ 3;1,25,26;,
+ 3;1,26,27;,
+ 3;1,27,28;,
+ 3;1,28,29;,
+ 3;1,29,30;,
+ 3;1,30,31;,
+ 3;1,31,32;,
+ 3;1,32,33;,
+ 3;1,33,34;,
+ 3;1,34,35;,
+ 3;1,35,36;,
+ 3;1,36,37;,
+ 3;1,37,38;,
+ 3;1,38,39;,
+ 3;0,39,40;,
+ 3;0,40,41;,
+ 3;0,41,42;,
+ 3;0,42,43;,
+ 3;0,43,44;,
+ 3;0,44,45;,
+ 3;0,45,46;,
+ 3;0,46,47;,
+ 3;0,47,48;,
+ 3;0,48,49;,
+ 3;0,49,50;,
+ 3;0,50,2;,
+ 3;2302,2305,2303;,
+ 3;2301,2305,2302;,
+ 3;2300,2305,2301;,
+ 3;2299,2305,2300;,
+ 3;2298,2305,2299;,
+ 3;2297,2305,2298;,
+ 3;2296,2305,2297;,
+ 3;2295,2305,2296;,
+ 3;2294,2305,2295;,
+ 3;2293,2305,2294;,
+ 3;2293,2292,2305;,
+ 3;2292,2291,2305;,
+ 3;2291,2290,2305;,
+ 3;2290,2289,2305;,
+ 3;2289,2288,2305;,
+ 3;2288,2287,2306;,
+ 3;2287,2286,2306;,
+ 3;2286,2285,2306;,
+ 3;2285,2284,2306;,
+ 3;2284,2283,2306;,
+ 3;2283,2282,2306;,
+ 3;2282,2281,2306;,
+ 3;2281,2280,2306;,
+ 3;2280,2279,2306;,
+ 3;2279,2278,2306;,
+ 3;2278,2277,2306;,
+ 3;2277,2276,2306;,
+ 3;2276,2275,2306;,
+ 3;2275,2274,2306;,
+ 3;2274,2273,2306;,
+ 3;2273,2272,2306;,
+ 3;2272,2271,2306;,
+ 3;2271,2270,2306;,
+ 3;2270,2268,2306;,
+ 3;2267,2305,2269;,
+ 3;2266,2305,2267;,
+ 3;2265,2305,2266;,
+ 3;2264,2305,2265;,
+ 3;2263,2305,2264;,
+ 3;2262,2305,2263;,
+ 3;2261,2305,2262;,
+ 3;2260,2305,2261;,
+ 3;2259,2305,2260;,
+ 3;2258,2305,2259;,
+ 3;2257,2305,2258;,
+ 3;2256,2305,2257;,
+ 3;0,2,3;,
+ 3;2303,2305,2304;,
+ 4;321,320,369,370;,
+ 4;52,101,102,53;,
+ 4;53,102,103,54;,
+ 4;54,103,104,55;,
+ 4;55,104,105,56;,
+ 4;56,105,106,57;,
+ 4;57,106,107,58;,
+ 4;58,107,108,59;,
+ 4;59,108,109,60;,
+ 4;60,109,110,61;,
+ 4;61,110,111,62;,
+ 4;62,111,112,63;,
+ 4;65,64,113,114;,
+ 4;66,65,114,115;,
+ 4;67,66,115,116;,
+ 4;68,67,116,117;,
+ 4;69,68,117,118;,
+ 4;70,69,118,119;,
+ 4;71,70,119,120;,
+ 4;72,71,120,121;,
+ 4;73,72,121,122;,
+ 4;74,73,122,123;,
+ 4;75,74,123,124;,
+ 4;76,75,124,125;,
+ 4;77,76,125,126;,
+ 4;78,77,126,127;,
+ 4;79,78,127,128;,
+ 4;80,79,128,129;,
+ 4;81,80,129,130;,
+ 4;82,81,130,131;,
+ 4;83,82,131,132;,
+ 4;84,83,132,133;,
+ 4;85,84,133,134;,
+ 4;86,85,134,135;,
+ 4;87,86,135,136;,
+ 4;88,87,136,137;,
+ 4;88,137,138,89;,
+ 4;89,138,139,90;,
+ 4;90,139,140,91;,
+ 4;91,140,141,92;,
+ 4;92,141,142,93;,
+ 4;93,142,143,94;,
+ 4;94,143,144,95;,
+ 4;95,144,145,96;,
+ 4;96,145,146,97;,
+ 4;97,146,147,98;,
+ 4;98,147,148,99;,
+ 4;99,148,100,51;,
+ 4;100,149,150,101;,
+ 4;101,150,151,102;,
+ 4;102,151,152,103;,
+ 4;103,152,153,104;,
+ 4;104,153,154,105;,
+ 4;105,154,155,106;,
+ 4;106,155,156,107;,
+ 4;107,156,157,108;,
+ 4;108,157,158,109;,
+ 4;109,158,159,110;,
+ 4;110,159,160,111;,
+ 4;111,160,161,112;,
+ 4;114,113,162,163;,
+ 4;115,114,163,164;,
+ 4;116,115,164,165;,
+ 4;117,116,165,166;,
+ 4;118,117,166,167;,
+ 4;119,118,167,168;,
+ 4;120,119,168,169;,
+ 4;121,120,169,170;,
+ 4;122,121,170,171;,
+ 4;123,122,171,172;,
+ 4;124,123,172,173;,
+ 4;125,124,173,174;,
+ 4;126,125,174,175;,
+ 4;127,126,175,176;,
+ 4;128,127,176,177;,
+ 4;129,128,177,178;,
+ 4;130,129,178,179;,
+ 4;131,130,179,180;,
+ 4;132,131,180,181;,
+ 4;133,132,181,182;,
+ 4;134,133,182,183;,
+ 4;135,134,183,184;,
+ 4;136,135,184,185;,
+ 4;137,136,185,186;,
+ 4;137,186,187,138;,
+ 4;138,187,188,139;,
+ 4;139,188,189,140;,
+ 4;140,189,190,141;,
+ 4;141,190,191,142;,
+ 4;142,191,192,143;,
+ 4;143,192,193,144;,
+ 4;144,193,194,145;,
+ 4;145,194,195,146;,
+ 4;146,195,196,147;,
+ 4;147,196,197,148;,
+ 4;148,197,149,100;,
+ 4;149,198,199,150;,
+ 4;150,199,200,151;,
+ 4;151,200,201,152;,
+ 4;152,201,202,153;,
+ 4;153,202,203,154;,
+ 4;154,203,204,155;,
+ 4;155,204,205,156;,
+ 4;156,205,206,157;,
+ 4;157,206,207,158;,
+ 4;158,207,208,159;,
+ 4;159,208,209,160;,
+ 4;160,209,210,161;,
+ 4;163,162,211,212;,
+ 4;164,163,212,213;,
+ 4;165,164,213,214;,
+ 4;166,165,214,215;,
+ 4;167,166,215,216;,
+ 4;168,167,216,217;,
+ 4;169,168,217,218;,
+ 4;170,169,218,219;,
+ 4;171,170,219,220;,
+ 4;172,171,220,221;,
+ 4;173,172,221,222;,
+ 4;174,173,222,223;,
+ 4;175,174,223,224;,
+ 4;176,175,224,225;,
+ 4;177,176,225,226;,
+ 4;178,177,226,227;,
+ 4;179,178,227,228;,
+ 4;180,179,228,229;,
+ 4;181,180,229,230;,
+ 4;182,181,230,231;,
+ 4;183,182,231,232;,
+ 4;184,183,232,233;,
+ 4;185,184,233,234;,
+ 4;186,185,234,235;,
+ 4;186,235,236,187;,
+ 4;187,236,237,188;,
+ 4;188,237,238,189;,
+ 4;189,238,239,190;,
+ 4;190,239,240,191;,
+ 4;191,240,241,192;,
+ 4;192,241,242,193;,
+ 4;193,242,243,194;,
+ 4;194,243,244,195;,
+ 4;195,244,245,196;,
+ 4;196,245,246,197;,
+ 4;197,246,198,149;,
+ 4;198,247,248,199;,
+ 4;199,248,249,200;,
+ 4;200,249,250,201;,
+ 4;201,250,251,202;,
+ 4;202,251,252,203;,
+ 4;203,252,253,204;,
+ 4;204,253,254,205;,
+ 4;205,254,255,206;,
+ 4;206,255,256,207;,
+ 4;207,256,257,208;,
+ 4;208,257,258,209;,
+ 4;209,258,259,210;,
+ 4;212,211,260,261;,
+ 4;213,212,261,262;,
+ 4;214,213,262,263;,
+ 4;215,214,263,264;,
+ 4;216,215,264,265;,
+ 4;217,216,265,266;,
+ 4;218,217,266,267;,
+ 4;219,218,267,268;,
+ 4;220,219,268,269;,
+ 4;221,220,269,270;,
+ 4;222,221,270,271;,
+ 4;223,222,271,272;,
+ 4;224,223,272,273;,
+ 4;225,224,273,274;,
+ 4;226,225,274,275;,
+ 4;227,226,275,276;,
+ 4;228,227,276,277;,
+ 4;229,228,277,278;,
+ 4;230,229,278,279;,
+ 4;231,230,279,280;,
+ 4;232,231,280,281;,
+ 4;233,232,281,282;,
+ 4;234,233,282,283;,
+ 4;235,234,283,284;,
+ 4;235,284,285,236;,
+ 4;236,285,286,237;,
+ 4;237,286,287,238;,
+ 4;238,287,288,239;,
+ 4;239,288,289,240;,
+ 4;240,289,290,241;,
+ 4;241,290,291,242;,
+ 4;242,291,292,243;,
+ 4;243,292,293,244;,
+ 4;244,293,294,245;,
+ 4;245,294,295,246;,
+ 4;246,295,247,198;,
+ 4;247,296,297,248;,
+ 4;248,297,298,249;,
+ 4;249,298,299,250;,
+ 4;250,299,300,251;,
+ 4;251,300,301,252;,
+ 4;252,301,302,253;,
+ 4;253,302,303,254;,
+ 4;254,303,304,255;,
+ 4;255,304,305,256;,
+ 4;256,305,306,257;,
+ 4;257,306,307,258;,
+ 4;258,307,308,259;,
+ 4;261,260,309,310;,
+ 4;262,261,310,311;,
+ 4;263,262,311,312;,
+ 4;264,263,312,313;,
+ 4;265,264,313,314;,
+ 4;266,265,314,315;,
+ 4;267,266,315,316;,
+ 4;268,267,316,317;,
+ 4;269,268,317,318;,
+ 4;270,269,318,319;,
+ 4;271,270,319,320;,
+ 4;272,271,320,321;,
+ 4;273,272,321,322;,
+ 4;274,273,322,323;,
+ 4;275,274,323,324;,
+ 4;276,275,324,325;,
+ 4;277,276,325,326;,
+ 4;278,277,326,327;,
+ 4;279,278,327,328;,
+ 4;280,279,328,329;,
+ 4;281,280,329,330;,
+ 4;282,281,330,331;,
+ 4;283,282,331,332;,
+ 4;284,283,332,333;,
+ 4;284,333,334,285;,
+ 4;285,334,335,286;,
+ 4;286,335,336,287;,
+ 4;287,336,337,288;,
+ 4;288,337,338,289;,
+ 4;289,338,339,290;,
+ 4;290,339,340,291;,
+ 4;291,340,341,292;,
+ 4;292,341,342,293;,
+ 4;293,342,343,294;,
+ 4;294,343,344,295;,
+ 4;295,344,296,247;,
+ 4;296,345,346,297;,
+ 4;297,346,347,298;,
+ 4;298,347,348,299;,
+ 4;299,348,349,300;,
+ 4;300,349,350,301;,
+ 4;301,350,351,302;,
+ 4;302,351,352,303;,
+ 4;303,352,353,304;,
+ 4;304,353,354,305;,
+ 4;305,354,355,306;,
+ 4;306,355,356,307;,
+ 4;307,356,357,308;,
+ 4;310,309,358,359;,
+ 4;311,310,359,360;,
+ 4;312,311,360,361;,
+ 4;313,312,361,362;,
+ 4;314,313,362,363;,
+ 4;315,314,363,364;,
+ 4;316,315,364,365;,
+ 4;317,316,365,366;,
+ 4;318,317,366,367;,
+ 4;319,318,367,368;,
+ 4;50,99,51,2;,
+ 4;51,100,101,52;,
+ 4;322,321,370,371;,
+ 4;323,322,371,372;,
+ 4;324,323,372,373;,
+ 4;325,324,373,374;,
+ 4;326,325,374,375;,
+ 4;327,326,375,376;,
+ 4;328,327,376,377;,
+ 4;329,328,377,378;,
+ 4;330,329,378,379;,
+ 4;331,330,379,380;,
+ 4;332,331,380,381;,
+ 4;333,332,381,382;,
+ 4;333,382,383,334;,
+ 4;334,383,384,335;,
+ 4;335,384,385,336;,
+ 4;336,385,386,337;,
+ 4;337,386,387,338;,
+ 4;338,387,388,339;,
+ 4;339,388,389,340;,
+ 4;340,389,390,341;,
+ 4;341,390,391,342;,
+ 4;342,391,392,343;,
+ 4;343,392,393,344;,
+ 4;344,393,345,296;,
+ 4;345,394,395,346;,
+ 4;346,395,396,347;,
+ 4;347,396,397,348;,
+ 4;348,397,398,349;,
+ 4;349,398,399,350;,
+ 4;350,399,400,351;,
+ 4;351,400,401,352;,
+ 4;352,401,402,353;,
+ 4;353,402,403,354;,
+ 4;354,403,404,355;,
+ 4;355,404,405,356;,
+ 4;356,405,406,357;,
+ 4;359,358,407,408;,
+ 4;360,359,408,409;,
+ 4;361,360,409,410;,
+ 4;362,361,410,411;,
+ 4;363,362,411,412;,
+ 4;364,363,412,413;,
+ 4;365,364,413,414;,
+ 4;366,365,414,415;,
+ 4;367,366,415,416;,
+ 4;368,367,416,417;,
+ 4;369,368,417,418;,
+ 4;370,369,418,419;,
+ 4;371,370,419,420;,
+ 4;372,371,420,421;,
+ 4;373,372,421,422;,
+ 4;374,373,422,423;,
+ 4;375,374,423,424;,
+ 4;376,375,424,425;,
+ 4;377,376,425,426;,
+ 4;378,377,426,427;,
+ 4;379,378,427,428;,
+ 4;380,379,428,429;,
+ 4;381,380,429,430;,
+ 4;382,381,430,431;,
+ 4;382,431,432,383;,
+ 4;383,432,433,384;,
+ 4;384,433,434,385;,
+ 4;385,434,435,386;,
+ 4;386,435,436,387;,
+ 4;387,436,437,388;,
+ 4;388,437,438,389;,
+ 4;389,438,439,390;,
+ 4;390,439,440,391;,
+ 4;391,440,441,392;,
+ 4;392,441,442,393;,
+ 4;393,442,394,345;,
+ 4;394,443,444,395;,
+ 4;395,444,445,396;,
+ 4;396,445,446,397;,
+ 4;397,446,447,398;,
+ 4;398,447,448,399;,
+ 4;399,448,449,400;,
+ 4;400,449,450,401;,
+ 4;401,450,451,402;,
+ 4;402,451,452,403;,
+ 4;403,452,453,404;,
+ 4;404,453,454,405;,
+ 4;405,454,455,406;,
+ 4;408,407,456,457;,
+ 4;409,408,457,458;,
+ 4;410,409,458,459;,
+ 4;411,410,459,460;,
+ 4;412,411,460,461;,
+ 4;413,412,461,462;,
+ 4;414,413,462,463;,
+ 4;415,414,463,464;,
+ 4;416,415,464,465;,
+ 4;417,416,465,466;,
+ 4;418,417,466,467;,
+ 4;419,418,467,468;,
+ 4;420,419,468,469;,
+ 4;421,420,469,470;,
+ 4;422,421,470,471;,
+ 4;423,422,471,472;,
+ 4;424,423,472,473;,
+ 4;425,424,473,474;,
+ 4;426,425,474,475;,
+ 4;427,426,475,476;,
+ 4;428,427,476,477;,
+ 4;429,428,477,478;,
+ 4;430,429,478,479;,
+ 4;431,430,479,480;,
+ 4;431,480,481,432;,
+ 4;432,481,482,433;,
+ 4;433,482,483,434;,
+ 4;434,483,484,435;,
+ 4;435,484,485,436;,
+ 4;436,485,486,437;,
+ 4;437,486,487,438;,
+ 4;438,487,488,439;,
+ 4;439,488,489,440;,
+ 4;440,489,490,441;,
+ 4;441,490,491,442;,
+ 4;442,491,443,394;,
+ 4;443,492,493,444;,
+ 4;444,493,494,445;,
+ 4;445,494,495,446;,
+ 4;446,495,496,447;,
+ 4;447,496,497,448;,
+ 4;448,497,498,449;,
+ 4;449,498,499,450;,
+ 4;450,499,500,451;,
+ 4;451,500,501,452;,
+ 4;452,501,502,453;,
+ 4;453,502,503,454;,
+ 4;454,503,504,455;,
+ 4;457,456,505,506;,
+ 4;458,457,506,507;,
+ 4;459,458,507,508;,
+ 4;460,459,508,509;,
+ 4;461,460,509,510;,
+ 4;462,461,510,511;,
+ 4;463,462,511,512;,
+ 4;464,463,512,513;,
+ 4;465,464,513,514;,
+ 4;466,465,514,515;,
+ 4;467,466,515,516;,
+ 4;468,467,516,517;,
+ 4;469,468,517,518;,
+ 4;470,469,518,519;,
+ 4;471,470,519,520;,
+ 4;472,471,520,521;,
+ 4;473,472,521,522;,
+ 4;474,473,522,523;,
+ 4;475,474,523,524;,
+ 4;476,475,524,525;,
+ 4;477,476,525,526;,
+ 4;478,477,526,527;,
+ 4;479,478,527,528;,
+ 4;480,479,528,529;,
+ 4;480,529,530,481;,
+ 4;481,530,531,482;,
+ 4;482,531,532,483;,
+ 4;483,532,533,484;,
+ 4;484,533,534,485;,
+ 4;485,534,535,486;,
+ 4;486,535,536,487;,
+ 4;487,536,537,488;,
+ 4;488,537,538,489;,
+ 4;489,538,539,490;,
+ 4;490,539,540,491;,
+ 4;491,540,492,443;,
+ 4;492,541,542,493;,
+ 4;493,542,543,494;,
+ 4;494,543,544,495;,
+ 4;495,544,545,496;,
+ 4;496,545,546,497;,
+ 4;497,546,547,498;,
+ 4;498,547,548,499;,
+ 4;499,548,549,500;,
+ 4;500,549,550,501;,
+ 4;501,550,551,502;,
+ 4;502,551,552,503;,
+ 4;503,552,553,504;,
+ 4;506,505,554,555;,
+ 4;507,506,555,556;,
+ 4;508,507,556,557;,
+ 4;509,508,557,558;,
+ 4;510,509,558,559;,
+ 4;511,510,559,560;,
+ 4;512,511,560,561;,
+ 4;513,512,561,562;,
+ 4;514,513,562,563;,
+ 4;515,514,563,564;,
+ 4;516,515,564,565;,
+ 4;517,516,565,566;,
+ 4;518,517,566,567;,
+ 4;519,518,567,568;,
+ 4;520,519,568,569;,
+ 4;521,520,569,570;,
+ 4;522,521,570,571;,
+ 4;523,522,571,572;,
+ 4;524,523,572,573;,
+ 4;525,524,573,574;,
+ 4;526,525,574,575;,
+ 4;527,526,575,576;,
+ 4;528,527,576,577;,
+ 4;529,528,577,578;,
+ 4;529,578,579,530;,
+ 4;530,579,580,531;,
+ 4;531,580,581,532;,
+ 4;532,581,582,533;,
+ 4;533,582,583,534;,
+ 4;534,583,584,535;,
+ 4;535,584,585,536;,
+ 4;536,585,586,537;,
+ 4;537,586,587,538;,
+ 4;538,587,588,539;,
+ 4;539,588,589,540;,
+ 4;540,589,541,492;,
+ 4;541,590,591,542;,
+ 4;542,591,592,543;,
+ 4;543,592,593,544;,
+ 4;544,593,594,545;,
+ 4;545,594,595,546;,
+ 4;546,595,596,547;,
+ 4;547,596,597,548;,
+ 4;548,597,598,549;,
+ 4;549,598,599,550;,
+ 4;550,599,600,551;,
+ 4;551,600,601,552;,
+ 4;552,601,602,553;,
+ 4;555,554,603,604;,
+ 4;556,555,604,605;,
+ 4;557,556,605,606;,
+ 4;558,557,606,607;,
+ 4;559,558,607,608;,
+ 4;560,559,608,609;,
+ 4;561,560,609,610;,
+ 4;562,561,610,611;,
+ 4;563,562,611,612;,
+ 4;564,563,612,613;,
+ 4;565,564,613,614;,
+ 4;566,565,614,615;,
+ 4;567,566,615,616;,
+ 4;568,567,616,617;,
+ 4;569,568,617,618;,
+ 4;570,569,618,619;,
+ 4;571,570,619,620;,
+ 4;572,571,620,621;,
+ 4;573,572,621,622;,
+ 4;574,573,622,623;,
+ 4;575,574,623,624;,
+ 4;576,575,624,625;,
+ 4;577,576,625,626;,
+ 4;578,577,626,627;,
+ 4;578,627,628,579;,
+ 4;579,628,629,580;,
+ 4;580,629,630,581;,
+ 4;581,630,631,582;,
+ 4;582,631,632,583;,
+ 4;583,632,633,584;,
+ 4;584,633,634,585;,
+ 4;585,634,635,586;,
+ 4;586,635,636,587;,
+ 4;587,636,637,588;,
+ 4;320,319,368,369;,
+ 4;588,637,638,589;,
+ 4;590,639,640,591;,
+ 4;591,640,641,592;,
+ 4;592,641,642,593;,
+ 4;593,642,643,594;,
+ 4;594,643,644,595;,
+ 4;595,644,645,596;,
+ 4;596,645,646,597;,
+ 4;597,646,647,598;,
+ 4;598,647,648,599;,
+ 4;599,648,649,600;,
+ 4;600,649,650,601;,
+ 4;601,650,651,602;,
+ 4;604,603,652,653;,
+ 4;605,604,653,654;,
+ 4;606,605,654,655;,
+ 4;607,606,655,656;,
+ 4;608,607,656,657;,
+ 4;609,608,657,658;,
+ 4;610,609,658,659;,
+ 4;611,610,659,660;,
+ 4;612,611,660,661;,
+ 4;613,612,661,662;,
+ 4;614,613,662,663;,
+ 4;615,614,663,664;,
+ 4;616,615,664,665;,
+ 4;617,616,665,666;,
+ 4;618,617,666,667;,
+ 4;619,618,667,668;,
+ 4;620,619,668,669;,
+ 4;621,620,669,670;,
+ 4;622,621,670,671;,
+ 4;623,622,671,672;,
+ 4;624,623,672,673;,
+ 4;625,624,673,674;,
+ 4;626,625,674,675;,
+ 4;627,626,675,676;,
+ 4;627,676,677,628;,
+ 4;628,677,678,629;,
+ 4;629,678,679,630;,
+ 4;630,679,680,631;,
+ 4;631,680,681,632;,
+ 4;632,681,682,633;,
+ 4;633,682,683,634;,
+ 4;634,683,684,635;,
+ 4;635,684,685,636;,
+ 4;636,685,686,637;,
+ 4;637,686,687,638;,
+ 4;638,687,639,590;,
+ 4;639,688,689,640;,
+ 4;640,689,690,641;,
+ 4;641,690,691,642;,
+ 4;642,691,692,643;,
+ 4;643,692,693,644;,
+ 4;644,693,694,645;,
+ 4;645,694,695,646;,
+ 4;646,695,696,647;,
+ 4;647,696,697,648;,
+ 4;648,697,698,649;,
+ 4;649,698,699,650;,
+ 4;650,699,700,651;,
+ 4;653,652,701,702;,
+ 4;654,653,702,703;,
+ 4;655,654,703,704;,
+ 4;656,655,704,705;,
+ 4;657,656,705,706;,
+ 4;658,657,706,707;,
+ 4;659,658,707,708;,
+ 4;660,659,708,709;,
+ 4;661,660,709,710;,
+ 4;662,661,710,711;,
+ 4;663,662,711,712;,
+ 4;664,663,712,713;,
+ 4;665,664,713,714;,
+ 4;666,665,714,715;,
+ 4;667,666,715,716;,
+ 4;668,667,716,717;,
+ 4;669,668,717,718;,
+ 4;670,669,718,719;,
+ 4;671,670,719,720;,
+ 4;672,671,720,721;,
+ 4;673,672,721,722;,
+ 4;674,673,722,723;,
+ 4;675,674,723,724;,
+ 4;676,675,724,725;,
+ 4;676,725,726,677;,
+ 4;677,726,727,678;,
+ 4;678,727,728,679;,
+ 4;679,728,729,680;,
+ 4;680,729,730,681;,
+ 4;681,730,731,682;,
+ 4;682,731,732,683;,
+ 4;683,732,733,684;,
+ 4;684,733,734,685;,
+ 4;685,734,735,686;,
+ 4;686,735,736,687;,
+ 4;687,736,688,639;,
+ 4;688,737,738,689;,
+ 4;689,738,739,690;,
+ 4;690,739,740,691;,
+ 4;691,740,741,692;,
+ 4;692,741,742,693;,
+ 4;693,742,743,694;,
+ 4;694,743,744,695;,
+ 4;695,744,745,696;,
+ 4;696,745,746,697;,
+ 4;697,746,747,698;,
+ 4;698,747,748,699;,
+ 4;699,748,749,700;,
+ 4;702,701,750,751;,
+ 4;703,702,751,752;,
+ 4;704,703,752,753;,
+ 4;705,704,753,754;,
+ 4;706,705,754,755;,
+ 4;707,706,755,756;,
+ 4;708,707,756,757;,
+ 4;709,708,757,758;,
+ 4;710,709,758,759;,
+ 4;711,710,759,760;,
+ 4;712,711,760,761;,
+ 4;713,712,761,762;,
+ 4;714,713,762,763;,
+ 4;715,714,763,764;,
+ 4;716,715,764,765;,
+ 4;717,716,765,766;,
+ 4;718,717,766,767;,
+ 4;719,718,767,768;,
+ 4;720,719,768,769;,
+ 4;721,720,769,770;,
+ 4;722,721,770,771;,
+ 4;723,722,771,772;,
+ 4;724,723,772,773;,
+ 4;725,724,773,774;,
+ 4;725,774,775,726;,
+ 4;726,775,776,727;,
+ 4;727,776,777,728;,
+ 4;728,777,778,729;,
+ 4;729,778,779,730;,
+ 4;730,779,780,731;,
+ 4;731,780,781,732;,
+ 4;732,781,782,733;,
+ 4;733,782,783,734;,
+ 4;734,783,784,735;,
+ 4;735,784,785,736;,
+ 4;736,785,737,688;,
+ 4;737,786,787,738;,
+ 4;738,787,788,739;,
+ 4;739,788,789,740;,
+ 4;740,789,790,741;,
+ 4;741,790,791,742;,
+ 4;742,791,792,743;,
+ 4;743,792,793,744;,
+ 4;744,793,794,745;,
+ 4;745,794,795,746;,
+ 4;746,795,796,747;,
+ 4;747,796,797,748;,
+ 4;748,797,798,749;,
+ 4;751,750,799,800;,
+ 4;752,751,800,801;,
+ 4;753,752,801,802;,
+ 4;754,753,802,803;,
+ 4;755,754,803,804;,
+ 4;756,755,804,805;,
+ 4;757,756,805,806;,
+ 4;758,757,806,807;,
+ 4;759,758,807,808;,
+ 4;760,759,808,809;,
+ 4;761,760,809,810;,
+ 4;762,761,810,811;,
+ 4;763,762,811,812;,
+ 4;764,763,812,813;,
+ 4;765,764,813,814;,
+ 4;766,765,814,815;,
+ 4;767,766,815,816;,
+ 4;768,767,816,817;,
+ 4;769,768,817,818;,
+ 4;770,769,818,819;,
+ 4;771,770,819,820;,
+ 4;772,771,820,821;,
+ 4;773,772,821,822;,
+ 4;774,773,822,823;,
+ 4;774,823,824,775;,
+ 4;775,824,825,776;,
+ 4;776,825,826,777;,
+ 4;777,826,827,778;,
+ 4;778,827,828,779;,
+ 4;779,828,829,780;,
+ 4;780,829,830,781;,
+ 4;781,830,831,782;,
+ 4;782,831,832,783;,
+ 4;783,832,833,784;,
+ 4;784,833,834,785;,
+ 4;785,834,786,737;,
+ 4;786,835,836,787;,
+ 4;787,836,837,788;,
+ 4;788,837,838,789;,
+ 4;789,838,839,790;,
+ 4;790,839,840,791;,
+ 4;791,840,841,792;,
+ 4;792,841,842,793;,
+ 4;793,842,843,794;,
+ 4;794,843,844,795;,
+ 4;795,844,845,796;,
+ 4;796,845,846,797;,
+ 4;797,846,847,798;,
+ 4;800,799,848,849;,
+ 4;801,800,849,850;,
+ 4;802,801,850,851;,
+ 4;803,802,851,852;,
+ 4;804,803,852,853;,
+ 4;805,804,853,854;,
+ 4;806,805,854,855;,
+ 4;807,806,855,856;,
+ 4;808,807,856,857;,
+ 4;809,808,857,858;,
+ 4;810,809,858,859;,
+ 4;811,810,859,860;,
+ 4;812,811,860,861;,
+ 4;813,812,861,862;,
+ 4;814,813,862,863;,
+ 4;815,814,863,864;,
+ 4;816,815,864,865;,
+ 4;817,816,865,866;,
+ 4;818,817,866,867;,
+ 4;819,818,867,868;,
+ 4;820,819,868,869;,
+ 4;821,820,869,870;,
+ 4;822,821,870,871;,
+ 4;823,822,871,872;,
+ 4;823,872,873,824;,
+ 4;824,873,874,825;,
+ 4;825,874,875,826;,
+ 4;826,875,876,827;,
+ 4;827,876,877,828;,
+ 4;828,877,878,829;,
+ 4;829,878,879,830;,
+ 4;830,879,880,831;,
+ 4;831,880,881,832;,
+ 4;832,881,882,833;,
+ 4;833,882,883,834;,
+ 4;834,883,835,786;,
+ 4;835,884,885,836;,
+ 4;836,885,886,837;,
+ 4;837,886,887,838;,
+ 4;838,887,888,839;,
+ 4;839,888,889,840;,
+ 4;840,889,890,841;,
+ 4;841,890,891,842;,
+ 4;842,891,892,843;,
+ 4;843,892,893,844;,
+ 4;844,893,894,845;,
+ 4;845,894,895,846;,
+ 4;846,895,896,847;,
+ 4;849,848,897,898;,
+ 4;850,849,898,899;,
+ 4;851,850,899,900;,
+ 4;852,851,900,901;,
+ 4;853,852,901,902;,
+ 4;854,853,902,903;,
+ 4;855,854,903,904;,
+ 4;856,855,904,905;,
+ 4;857,856,905,906;,
+ 4;858,857,906,907;,
+ 4;859,858,907,908;,
+ 4;860,859,908,909;,
+ 4;861,860,909,910;,
+ 4;862,861,910,911;,
+ 4;863,862,911,912;,
+ 4;864,863,912,913;,
+ 4;865,864,913,914;,
+ 4;866,865,914,915;,
+ 4;867,866,915,916;,
+ 4;868,867,916,917;,
+ 4;869,868,917,918;,
+ 4;870,869,918,919;,
+ 4;871,870,919,920;,
+ 4;872,871,920,921;,
+ 4;872,921,922,873;,
+ 4;873,922,923,874;,
+ 4;874,923,924,875;,
+ 4;875,924,925,876;,
+ 4;876,925,926,877;,
+ 4;877,926,927,878;,
+ 4;878,927,928,879;,
+ 4;879,928,929,880;,
+ 4;880,929,930,881;,
+ 4;881,930,931,882;,
+ 4;882,931,932,883;,
+ 4;883,932,884,835;,
+ 4;884,933,934,885;,
+ 4;885,934,935,886;,
+ 4;886,935,936,887;,
+ 4;887,936,937,888;,
+ 4;888,937,938,889;,
+ 4;889,938,939,890;,
+ 4;890,939,940,891;,
+ 4;891,940,941,892;,
+ 4;892,941,942,893;,
+ 4;893,942,943,894;,
+ 4;894,943,944,895;,
+ 4;895,944,945,896;,
+ 4;898,897,946,947;,
+ 4;899,898,947,948;,
+ 4;900,899,948,949;,
+ 4;901,900,949,950;,
+ 4;902,901,950,951;,
+ 4;903,902,951,952;,
+ 4;904,903,952,953;,
+ 4;905,904,953,954;,
+ 4;906,905,954,955;,
+ 4;907,906,955,956;,
+ 4;908,907,956,957;,
+ 4;909,908,957,958;,
+ 4;910,909,958,959;,
+ 4;911,910,959,960;,
+ 4;912,911,960,961;,
+ 4;913,912,961,962;,
+ 4;914,913,962,963;,
+ 4;915,914,963,964;,
+ 4;916,915,964,965;,
+ 4;917,916,965,966;,
+ 4;918,917,966,967;,
+ 4;919,918,967,968;,
+ 4;920,919,968,969;,
+ 4;921,920,969,970;,
+ 4;921,970,971,922;,
+ 4;922,971,972,923;,
+ 4;923,972,973,924;,
+ 4;924,973,974,925;,
+ 4;925,974,975,926;,
+ 4;926,975,976,927;,
+ 4;927,976,977,928;,
+ 4;928,977,978,929;,
+ 4;929,978,979,930;,
+ 4;930,979,980,931;,
+ 4;931,980,981,932;,
+ 4;932,981,933,884;,
+ 4;933,982,983,934;,
+ 4;934,983,984,935;,
+ 4;935,984,985,936;,
+ 4;936,985,986,937;,
+ 4;937,986,987,938;,
+ 4;938,987,988,939;,
+ 4;939,988,989,940;,
+ 4;940,989,990,941;,
+ 4;941,990,991,942;,
+ 4;942,991,992,943;,
+ 4;943,992,993,944;,
+ 4;944,993,994,945;,
+ 4;947,946,995,996;,
+ 4;948,947,996,997;,
+ 4;949,948,997,998;,
+ 4;950,949,998,999;,
+ 4;951,950,999,1000;,
+ 4;952,951,1000,1001;,
+ 4;953,952,1001,1002;,
+ 4;954,953,1002,1003;,
+ 4;955,954,1003,1004;,
+ 4;956,955,1004,1005;,
+ 4;957,956,1005,1006;,
+ 4;958,957,1006,1007;,
+ 4;959,958,1007,1008;,
+ 4;960,959,1008,1009;,
+ 4;961,960,1009,1010;,
+ 4;962,961,1010,1011;,
+ 4;963,962,1011,1012;,
+ 4;964,963,1012,1013;,
+ 4;965,964,1013,1014;,
+ 4;966,965,1014,1015;,
+ 4;967,966,1015,1016;,
+ 4;968,967,1016,1017;,
+ 4;969,968,1017,1018;,
+ 4;970,969,1018,1019;,
+ 4;970,1019,1020,971;,
+ 4;971,1020,1021,972;,
+ 4;972,1021,1022,973;,
+ 4;973,1022,1023,974;,
+ 4;974,1023,1024,975;,
+ 4;975,1024,1025,976;,
+ 4;976,1025,1026,977;,
+ 4;977,1026,1027,978;,
+ 4;978,1027,1028,979;,
+ 4;979,1028,1029,980;,
+ 4;980,1029,1030,981;,
+ 4;981,1030,982,933;,
+ 4;982,1031,1032,983;,
+ 4;983,1032,1033,984;,
+ 4;984,1033,1034,985;,
+ 4;985,1034,1035,986;,
+ 4;986,1035,1036,987;,
+ 4;987,1036,1037,988;,
+ 4;988,1037,1038,989;,
+ 4;989,1038,1039,990;,
+ 4;990,1039,1040,991;,
+ 4;991,1040,1041,992;,
+ 4;992,1041,1042,993;,
+ 4;993,1042,1043,994;,
+ 4;996,995,1044,1045;,
+ 4;997,996,1045,1046;,
+ 4;998,997,1046,1047;,
+ 4;999,998,1047,1048;,
+ 4;1000,999,1048,1049;,
+ 4;1001,1000,1049,1050;,
+ 4;1002,1001,1050,1051;,
+ 4;1003,1002,1051,1052;,
+ 4;1004,1003,1052,1053;,
+ 4;1005,1004,1053,1054;,
+ 4;1006,1005,1054,1055;,
+ 4;1007,1006,1055,1056;,
+ 4;1008,1007,1056,1057;,
+ 4;1009,1008,1057,1058;,
+ 4;1010,1009,1058,1059;,
+ 4;1011,1010,1059,1060;,
+ 4;1012,1011,1060,1061;,
+ 4;1013,1012,1061,1062;,
+ 4;1014,1013,1062,1063;,
+ 4;1015,1014,1063,1064;,
+ 4;1016,1015,1064,1065;,
+ 4;1017,1016,1065,1066;,
+ 4;1018,1017,1066,1067;,
+ 4;1019,1018,1067,1068;,
+ 4;1019,1068,1069,1020;,
+ 4;1020,1069,1070,1021;,
+ 4;1021,1070,1071,1022;,
+ 4;1022,1071,1072,1023;,
+ 4;1023,1072,1073,1024;,
+ 4;1024,1073,1074,1025;,
+ 4;1025,1074,1075,1026;,
+ 4;1026,1075,1076,1027;,
+ 4;1027,1076,1077,1028;,
+ 4;1028,1077,1078,1029;,
+ 4;1029,1078,1079,1030;,
+ 4;1030,1079,1031,982;,
+ 4;1031,1080,1081,1032;,
+ 4;1032,1081,1082,1033;,
+ 4;1033,1082,1083,1034;,
+ 4;1034,1083,1084,1035;,
+ 4;1035,1084,1085,1036;,
+ 4;1036,1085,1086,1037;,
+ 4;1037,1086,1087,1038;,
+ 4;1038,1087,1088,1039;,
+ 4;1039,1088,1089,1040;,
+ 4;1040,1089,1090,1041;,
+ 4;1041,1090,1091,1042;,
+ 4;1042,1091,1092,1043;,
+ 4;1045,1044,1093,1094;,
+ 4;1046,1045,1094,1095;,
+ 4;1047,1046,1095,1096;,
+ 4;1048,1047,1096,1097;,
+ 4;1049,1048,1097,1098;,
+ 4;1050,1049,1098,1099;,
+ 4;1051,1050,1099,1100;,
+ 4;1052,1051,1100,1101;,
+ 4;1053,1052,1101,1102;,
+ 4;1054,1053,1102,1103;,
+ 4;1055,1054,1103,1104;,
+ 4;1056,1055,1104,1105;,
+ 4;1057,1056,1105,1106;,
+ 4;1058,1057,1106,1107;,
+ 4;1059,1058,1107,1108;,
+ 4;1060,1059,1108,1109;,
+ 4;1061,1060,1109,1110;,
+ 4;1062,1061,1110,1111;,
+ 4;1063,1062,1111,1112;,
+ 4;1064,1063,1112,1113;,
+ 4;1065,1064,1113,1114;,
+ 4;1066,1065,1114,1115;,
+ 4;1067,1066,1115,1116;,
+ 4;1068,1067,1116,1117;,
+ 4;1068,1117,1118,1069;,
+ 4;1069,1118,1119,1070;,
+ 4;1070,1119,1120,1071;,
+ 4;1071,1120,1121,1072;,
+ 4;1072,1121,1122,1073;,
+ 4;1073,1122,1123,1074;,
+ 4;1074,1123,1124,1075;,
+ 4;1075,1124,1125,1076;,
+ 4;1076,1125,1126,1077;,
+ 4;1077,1126,1127,1078;,
+ 4;1078,1127,1128,1079;,
+ 4;1079,1128,1080,1031;,
+ 4;1080,1129,1130,1081;,
+ 4;1081,1130,1131,1082;,
+ 4;1082,1131,1132,1083;,
+ 4;1083,1132,1133,1084;,
+ 4;1084,1133,1134,1085;,
+ 4;1085,1134,1135,1086;,
+ 4;1086,1135,1136,1087;,
+ 4;1087,1136,1137,1088;,
+ 4;1088,1137,1138,1089;,
+ 4;1089,1138,1139,1090;,
+ 4;1090,1139,1140,1091;,
+ 4;1091,1140,1141,1092;,
+ 4;1094,1093,1142,1143;,
+ 4;1095,1094,1143,1144;,
+ 4;1096,1095,1144,1145;,
+ 4;1097,1096,1145,1146;,
+ 4;1098,1097,1146,1147;,
+ 4;1099,1098,1147,1148;,
+ 4;1100,1099,1148,1149;,
+ 4;1101,1100,1149,1150;,
+ 4;1102,1101,1150,1151;,
+ 4;1103,1102,1151,1152;,
+ 4;1104,1103,1152,1153;,
+ 4;1105,1104,1153,1154;,
+ 4;1106,1105,1154,1155;,
+ 4;1107,1106,1155,1156;,
+ 4;1108,1107,1156,1157;,
+ 4;1109,1108,1157,1158;,
+ 4;1110,1109,1158,1159;,
+ 4;1111,1110,1159,1160;,
+ 4;1112,1111,1160,1161;,
+ 4;1113,1112,1161,1162;,
+ 4;1114,1113,1162,1163;,
+ 4;1115,1114,1163,1164;,
+ 4;1116,1115,1164,1165;,
+ 4;1117,1116,1165,1166;,
+ 4;1117,1166,1167,1118;,
+ 4;1118,1167,1168,1119;,
+ 4;1119,1168,1169,1120;,
+ 4;1120,1169,1170,1121;,
+ 4;1121,1170,1171,1122;,
+ 4;1122,1171,1172,1123;,
+ 4;1123,1172,1173,1124;,
+ 4;1124,1173,1174,1125;,
+ 4;1125,1174,1175,1126;,
+ 4;1126,1175,1176,1127;,
+ 4;1127,1176,1177,1128;,
+ 4;589,638,590,541;,
+ 4;47,96,97,48;,
+ 4;1130,1179,1180,1131;,
+ 4;1131,1180,1181,1132;,
+ 4;1132,1181,1182,1133;,
+ 4;1133,1182,1183,1134;,
+ 4;1134,1183,1184,1135;,
+ 4;1135,1184,1185,1136;,
+ 4;1136,1185,1186,1137;,
+ 4;1137,1186,1187,1138;,
+ 4;1138,1187,1188,1139;,
+ 4;1139,1188,1189,1140;,
+ 4;1140,1189,1190,1141;,
+ 4;1143,1142,1191,1192;,
+ 4;1144,1143,1192,1193;,
+ 4;1145,1144,1193,1194;,
+ 4;1146,1145,1194,1195;,
+ 4;1147,1146,1195,1196;,
+ 4;1148,1147,1196,1197;,
+ 4;1149,1148,1197,1198;,
+ 4;1150,1149,1198,1199;,
+ 4;1151,1150,1199,1200;,
+ 4;1152,1151,1200,1201;,
+ 4;48,97,98,49;,
+ 4;49,98,99,50;,
+ 4;1155,1154,1203,1204;,
+ 4;1156,1155,1204,1205;,
+ 4;1157,1156,1205,1206;,
+ 4;1158,1157,1206,1207;,
+ 4;1159,1158,1207,1208;,
+ 4;1160,1159,1208,1209;,
+ 4;1161,1160,1209,1210;,
+ 4;1162,1161,1210,1211;,
+ 4;1163,1162,1211,1212;,
+ 4;1164,1163,1212,1213;,
+ 4;1165,1164,1213,1214;,
+ 4;1166,1165,1214,1215;,
+ 4;1166,1215,1216,1167;,
+ 4;1167,1216,1217,1168;,
+ 4;1168,1217,1218,1169;,
+ 4;1169,1218,1219,1170;,
+ 4;1170,1219,1220,1171;,
+ 4;1171,1220,1221,1172;,
+ 4;1172,1221,1222,1173;,
+ 4;1173,1222,1223,1174;,
+ 4;1174,1223,1224,1175;,
+ 4;1175,1224,1225,1176;,
+ 4;1176,1225,1226,1177;,
+ 4;1177,1226,1178,1129;,
+ 4;1178,1227,1228,1179;,
+ 4;1179,1228,1229,1180;,
+ 4;1180,1229,1230,1181;,
+ 4;1181,1230,1231,1182;,
+ 4;1182,1231,1232,1183;,
+ 4;1183,1232,1233,1184;,
+ 4;1184,1233,1234,1185;,
+ 4;1185,1234,1235,1186;,
+ 4;1186,1235,1236,1187;,
+ 4;1187,1236,1237,1188;,
+ 4;1188,1237,1238,1189;,
+ 4;1189,1238,1239,1190;,
+ 4;1192,1191,1240,1241;,
+ 4;1193,1192,1241,1242;,
+ 4;1194,1193,1242,1243;,
+ 4;1195,1194,1243,1244;,
+ 4;1196,1195,1244,1245;,
+ 4;1197,1196,1245,1246;,
+ 4;1198,1197,1246,1247;,
+ 4;1199,1198,1247,1248;,
+ 4;1200,1199,1248,1249;,
+ 4;1201,1200,1249,1250;,
+ 4;1202,1201,1250,1251;,
+ 4;1203,1202,1251,1252;,
+ 4;1204,1203,1252,1253;,
+ 4;1205,1204,1253,1254;,
+ 4;1206,1205,1254,1255;,
+ 4;1207,1206,1255,1256;,
+ 4;1208,1207,1256,1257;,
+ 4;1209,1208,1257,1258;,
+ 4;1210,1209,1258,1259;,
+ 4;1211,1210,1259,1260;,
+ 4;1212,1211,1260,1261;,
+ 4;1213,1212,1261,1262;,
+ 4;1214,1213,1262,1263;,
+ 4;1215,1214,1263,1264;,
+ 4;1215,1264,1265,1216;,
+ 4;1216,1265,1266,1217;,
+ 4;1217,1266,1267,1218;,
+ 4;1218,1267,1268,1219;,
+ 4;1219,1268,1269,1220;,
+ 4;1220,1269,1270,1221;,
+ 4;1221,1270,1271,1222;,
+ 4;1222,1271,1272,1223;,
+ 4;1223,1272,1273,1224;,
+ 4;1224,1273,1274,1225;,
+ 4;1225,1274,1275,1226;,
+ 4;1226,1275,1227,1178;,
+ 4;1227,1276,1277,1228;,
+ 4;1228,1277,1278,1229;,
+ 4;1229,1278,1279,1230;,
+ 4;1230,1279,1280,1231;,
+ 4;1231,1280,1281,1232;,
+ 4;1232,1281,1282,1233;,
+ 4;1233,1282,1283,1234;,
+ 4;1234,1283,1284,1235;,
+ 4;1235,1284,1285,1236;,
+ 4;1236,1285,1286,1237;,
+ 4;1237,1286,1287,1238;,
+ 4;1238,1287,1288,1239;,
+ 4;1241,1240,1289,1290;,
+ 4;1242,1241,1290,1291;,
+ 4;1243,1242,1291,1292;,
+ 4;1244,1243,1292,1293;,
+ 4;1245,1244,1293,1294;,
+ 4;1246,1245,1294,1295;,
+ 4;1247,1246,1295,1296;,
+ 4;1248,1247,1296,1297;,
+ 4;1249,1248,1297,1298;,
+ 4;1250,1249,1298,1299;,
+ 4;1251,1250,1299,1300;,
+ 4;1252,1251,1300,1301;,
+ 4;1253,1252,1301,1302;,
+ 4;1254,1253,1302,1303;,
+ 4;1255,1254,1303,1304;,
+ 4;1256,1255,1304,1305;,
+ 4;1257,1256,1305,1306;,
+ 4;1258,1257,1306,1307;,
+ 4;1259,1258,1307,1308;,
+ 4;1260,1259,1308,1309;,
+ 4;1261,1260,1309,1310;,
+ 4;1262,1261,1310,1311;,
+ 4;1263,1262,1311,1312;,
+ 4;1264,1263,1312,1313;,
+ 4;1264,1313,1314,1265;,
+ 4;1265,1314,1315,1266;,
+ 4;1266,1315,1316,1267;,
+ 4;1267,1316,1317,1268;,
+ 4;1268,1317,1318,1269;,
+ 4;1269,1318,1319,1270;,
+ 4;1270,1319,1320,1271;,
+ 4;1271,1320,1321,1272;,
+ 4;1272,1321,1322,1273;,
+ 4;1273,1322,1323,1274;,
+ 4;1274,1323,1324,1275;,
+ 4;1275,1324,1276,1227;,
+ 4;1276,1325,1326,1277;,
+ 4;1277,1326,1327,1278;,
+ 4;1278,1327,1328,1279;,
+ 4;1279,1328,1329,1280;,
+ 4;1280,1329,1330,1281;,
+ 4;1281,1330,1331,1282;,
+ 4;1282,1331,1332,1283;,
+ 4;1283,1332,1333,1284;,
+ 4;1284,1333,1334,1285;,
+ 4;1285,1334,1335,1286;,
+ 4;1286,1335,1336,1287;,
+ 4;1287,1336,1337,1288;,
+ 4;1290,1289,1338,1339;,
+ 4;1291,1290,1339,1340;,
+ 4;1292,1291,1340,1341;,
+ 4;1293,1292,1341,1342;,
+ 4;1294,1293,1342,1343;,
+ 4;1295,1294,1343,1344;,
+ 4;1296,1295,1344,1345;,
+ 4;1297,1296,1345,1346;,
+ 4;1298,1297,1346,1347;,
+ 4;1299,1298,1347,1348;,
+ 4;1300,1299,1348,1349;,
+ 4;1301,1300,1349,1350;,
+ 4;1302,1301,1350,1351;,
+ 4;1303,1302,1351,1352;,
+ 4;1304,1303,1352,1353;,
+ 4;1305,1304,1353,1354;,
+ 4;1306,1305,1354,1355;,
+ 4;1307,1306,1355,1356;,
+ 4;1308,1307,1356,1357;,
+ 4;1309,1308,1357,1358;,
+ 4;1310,1309,1358,1359;,
+ 4;1311,1310,1359,1360;,
+ 4;1312,1311,1360,1361;,
+ 4;1313,1312,1361,1362;,
+ 4;1313,1362,1363,1314;,
+ 4;1314,1363,1364,1315;,
+ 4;1315,1364,1365,1316;,
+ 4;1316,1365,1366,1317;,
+ 4;1317,1366,1367,1318;,
+ 4;1318,1367,1368,1319;,
+ 4;1319,1368,1369,1320;,
+ 4;1320,1369,1370,1321;,
+ 4;1321,1370,1371,1322;,
+ 4;1322,1371,1372,1323;,
+ 4;1323,1372,1373,1324;,
+ 4;1324,1373,1325,1276;,
+ 4;1325,1374,1375,1326;,
+ 4;1326,1375,1376,1327;,
+ 4;1327,1376,1377,1328;,
+ 4;1328,1377,1378,1329;,
+ 4;1329,1378,1379,1330;,
+ 4;1330,1379,1380,1331;,
+ 4;1331,1380,1381,1332;,
+ 4;1332,1381,1382,1333;,
+ 4;1333,1382,1383,1334;,
+ 4;1334,1383,1384,1335;,
+ 4;1335,1384,1385,1336;,
+ 4;1336,1385,1386,1337;,
+ 4;1339,1338,1387,1388;,
+ 4;1340,1339,1388,1389;,
+ 4;1341,1340,1389,1390;,
+ 4;1342,1341,1390,1391;,
+ 4;1343,1342,1391,1392;,
+ 4;1344,1343,1392,1393;,
+ 4;1345,1344,1393,1394;,
+ 4;1346,1345,1394,1395;,
+ 4;1347,1346,1395,1396;,
+ 4;1348,1347,1396,1397;,
+ 4;1349,1348,1397,1398;,
+ 4;1350,1349,1398,1399;,
+ 4;1351,1350,1399,1400;,
+ 4;1352,1351,1400,1401;,
+ 4;1353,1352,1401,1402;,
+ 4;1354,1353,1402,1403;,
+ 4;1355,1354,1403,1404;,
+ 4;1356,1355,1404,1405;,
+ 4;1357,1356,1405,1406;,
+ 4;1358,1357,1406,1407;,
+ 4;1359,1358,1407,1408;,
+ 4;1360,1359,1408,1409;,
+ 4;1361,1360,1409,1410;,
+ 4;1362,1361,1410,1411;,
+ 4;1362,1411,1412,1363;,
+ 4;1363,1412,1413,1364;,
+ 4;1364,1413,1414,1365;,
+ 4;1365,1414,1415,1366;,
+ 4;1366,1415,1416,1367;,
+ 4;1367,1416,1417,1368;,
+ 4;1368,1417,1418,1369;,
+ 4;1369,1418,1419,1370;,
+ 4;1370,1419,1420,1371;,
+ 4;1371,1420,1421,1372;,
+ 4;1372,1421,1422,1373;,
+ 4;1373,1422,1374,1325;,
+ 4;1374,1423,1424,1375;,
+ 4;1375,1424,1425,1376;,
+ 4;1376,1425,1426,1377;,
+ 4;1377,1426,1427,1378;,
+ 4;1378,1427,1428,1379;,
+ 4;1379,1428,1429,1380;,
+ 4;1380,1429,1430,1381;,
+ 4;1381,1430,1431,1382;,
+ 4;1382,1431,1432,1383;,
+ 4;1383,1432,1433,1384;,
+ 4;1384,1433,1434,1385;,
+ 4;1385,1434,1435,1386;,
+ 4;1388,1387,1436,1437;,
+ 4;1389,1388,1437,1438;,
+ 4;1390,1389,1438,1439;,
+ 4;1391,1390,1439,1440;,
+ 4;1392,1391,1440,1441;,
+ 4;1393,1392,1441,1442;,
+ 4;1394,1393,1442,1443;,
+ 4;1395,1394,1443,1444;,
+ 4;1396,1395,1444,1445;,
+ 4;1397,1396,1445,1446;,
+ 4;1398,1397,1446,1447;,
+ 4;1399,1398,1447,1448;,
+ 4;1400,1399,1448,1449;,
+ 4;1401,1400,1449,1450;,
+ 4;1402,1401,1450,1451;,
+ 4;1403,1402,1451,1452;,
+ 4;1404,1403,1452,1453;,
+ 4;1405,1404,1453,1454;,
+ 4;1406,1405,1454,1455;,
+ 4;1407,1406,1455,1456;,
+ 4;1408,1407,1456,1457;,
+ 4;1409,1408,1457,1458;,
+ 4;1410,1409,1458,1459;,
+ 4;1411,1410,1459,1460;,
+ 4;1411,1460,1461,1412;,
+ 4;1412,1461,1462,1413;,
+ 4;1413,1462,1463,1414;,
+ 4;1414,1463,1464,1415;,
+ 4;1415,1464,1465,1416;,
+ 4;1416,1465,1466,1417;,
+ 4;1417,1466,1467,1418;,
+ 4;1418,1467,1468,1419;,
+ 4;1419,1468,1469,1420;,
+ 4;1420,1469,1470,1421;,
+ 4;1421,1470,1471,1422;,
+ 4;1422,1471,1423,1374;,
+ 4;1423,1472,1473,1424;,
+ 4;1424,1473,1474,1425;,
+ 4;1425,1474,1475,1426;,
+ 4;1426,1475,1476,1427;,
+ 4;1427,1476,1477,1428;,
+ 4;1428,1477,1478,1429;,
+ 4;1429,1478,1479,1430;,
+ 4;1430,1479,1480,1431;,
+ 4;1431,1480,1481,1432;,
+ 4;1432,1481,1482,1433;,
+ 4;1433,1482,1483,1434;,
+ 4;1434,1483,1484,1435;,
+ 4;1437,1436,1485,1486;,
+ 4;1438,1437,1486,1487;,
+ 4;1439,1438,1487,1488;,
+ 4;1440,1439,1488,1489;,
+ 4;1441,1440,1489,1490;,
+ 4;1442,1441,1490,1491;,
+ 4;1443,1442,1491,1492;,
+ 4;1444,1443,1492,1493;,
+ 4;1445,1444,1493,1494;,
+ 4;1446,1445,1494,1495;,
+ 4;1447,1446,1495,1496;,
+ 4;1448,1447,1496,1497;,
+ 4;1449,1448,1497,1498;,
+ 4;1450,1449,1498,1499;,
+ 4;1451,1450,1499,1500;,
+ 4;1452,1451,1500,1501;,
+ 4;1453,1452,1501,1502;,
+ 4;1454,1453,1502,1503;,
+ 4;1455,1454,1503,1504;,
+ 4;1456,1455,1504,1505;,
+ 4;1457,1456,1505,1506;,
+ 4;1458,1457,1506,1507;,
+ 4;1459,1458,1507,1508;,
+ 4;1460,1459,1508,1509;,
+ 4;1460,1509,1510,1461;,
+ 4;1461,1510,1511,1462;,
+ 4;1462,1511,1512,1463;,
+ 4;1463,1512,1513,1464;,
+ 4;1464,1513,1514,1465;,
+ 4;1465,1514,1515,1466;,
+ 4;1466,1515,1516,1467;,
+ 4;1467,1516,1517,1468;,
+ 4;1468,1517,1518,1469;,
+ 4;1469,1518,1519,1470;,
+ 4;1470,1519,1520,1471;,
+ 4;1471,1520,1472,1423;,
+ 4;1472,1521,1522,1473;,
+ 4;1473,1522,1523,1474;,
+ 4;1474,1523,1524,1475;,
+ 4;1475,1524,1525,1476;,
+ 4;1476,1525,1526,1477;,
+ 4;1477,1526,1527,1478;,
+ 4;1478,1527,1528,1479;,
+ 4;1479,1528,1529,1480;,
+ 4;1480,1529,1530,1481;,
+ 4;1481,1530,1531,1482;,
+ 4;1482,1531,1532,1483;,
+ 4;1483,1532,1533,1484;,
+ 4;1486,1485,1534,1535;,
+ 4;1487,1486,1535,1536;,
+ 4;1488,1487,1536,1537;,
+ 4;1489,1488,1537,1538;,
+ 4;1490,1489,1538,1539;,
+ 4;1491,1490,1539,1540;,
+ 4;1492,1491,1540,1541;,
+ 4;1493,1492,1541,1542;,
+ 4;1494,1493,1542,1543;,
+ 4;1495,1494,1543,1544;,
+ 4;1496,1495,1544,1545;,
+ 4;1497,1496,1545,1546;,
+ 4;1498,1497,1546,1547;,
+ 4;1499,1498,1547,1548;,
+ 4;1500,1499,1548,1549;,
+ 4;1501,1500,1549,1550;,
+ 4;1502,1501,1550,1551;,
+ 4;1503,1502,1551,1552;,
+ 4;1504,1503,1552,1553;,
+ 4;1505,1504,1553,1554;,
+ 4;1506,1505,1554,1555;,
+ 4;1507,1506,1555,1556;,
+ 4;1508,1507,1556,1557;,
+ 4;1509,1508,1557,1558;,
+ 4;1509,1558,1559,1510;,
+ 4;1510,1559,1560,1511;,
+ 4;1511,1560,1561,1512;,
+ 4;1512,1561,1562,1513;,
+ 4;1513,1562,1563,1514;,
+ 4;1514,1563,1564,1515;,
+ 4;1515,1564,1565,1516;,
+ 4;1516,1565,1566,1517;,
+ 4;1517,1566,1567,1518;,
+ 4;1518,1567,1568,1519;,
+ 4;1519,1568,1569,1520;,
+ 4;1520,1569,1521,1472;,
+ 4;1521,1570,1571,1522;,
+ 4;1522,1571,1572,1523;,
+ 4;1523,1572,1573,1524;,
+ 4;1524,1573,1574,1525;,
+ 4;1525,1574,1575,1526;,
+ 4;1526,1575,1576,1527;,
+ 4;1527,1576,1577,1528;,
+ 4;1528,1577,1578,1529;,
+ 4;1529,1578,1579,1530;,
+ 4;1530,1579,1580,1531;,
+ 4;1531,1580,1581,1532;,
+ 4;1532,1581,1582,1533;,
+ 4;1535,1534,1583,1584;,
+ 4;1536,1535,1584,1585;,
+ 4;1537,1536,1585,1586;,
+ 4;1538,1537,1586,1587;,
+ 4;1539,1538,1587,1588;,
+ 4;1540,1539,1588,1589;,
+ 4;1541,1540,1589,1590;,
+ 4;1542,1541,1590,1591;,
+ 4;1543,1542,1591,1592;,
+ 4;1544,1543,1592,1593;,
+ 4;1545,1544,1593,1594;,
+ 4;1546,1545,1594,1595;,
+ 4;1547,1546,1595,1596;,
+ 4;1548,1547,1596,1597;,
+ 4;1549,1548,1597,1598;,
+ 4;1550,1549,1598,1599;,
+ 4;1551,1550,1599,1600;,
+ 4;1552,1551,1600,1601;,
+ 4;1553,1552,1601,1602;,
+ 4;1554,1553,1602,1603;,
+ 4;1555,1554,1603,1604;,
+ 4;1556,1555,1604,1605;,
+ 4;1557,1556,1605,1606;,
+ 4;1558,1557,1606,1607;,
+ 4;1558,1607,1608,1559;,
+ 4;1559,1608,1609,1560;,
+ 4;1560,1609,1610,1561;,
+ 4;1561,1610,1611,1562;,
+ 4;1562,1611,1612,1563;,
+ 4;1563,1612,1613,1564;,
+ 4;1564,1613,1614,1565;,
+ 4;1565,1614,1615,1566;,
+ 4;1566,1615,1616,1567;,
+ 4;1567,1616,1617,1568;,
+ 4;1568,1617,1618,1569;,
+ 4;1569,1618,1570,1521;,
+ 4;1570,1619,1620,1571;,
+ 4;1571,1620,1621,1572;,
+ 4;1572,1621,1622,1573;,
+ 4;1573,1622,1623,1574;,
+ 4;1574,1623,1624,1575;,
+ 4;1575,1624,1625,1576;,
+ 4;1576,1625,1626,1577;,
+ 4;1577,1626,1627,1578;,
+ 4;1578,1627,1628,1579;,
+ 4;1579,1628,1629,1580;,
+ 4;1580,1629,1630,1581;,
+ 4;1581,1630,1631,1582;,
+ 4;1584,1583,1632,1633;,
+ 4;1585,1584,1633,1634;,
+ 4;1586,1585,1634,1635;,
+ 4;1587,1586,1635,1636;,
+ 4;1588,1587,1636,1637;,
+ 4;1589,1588,1637,1638;,
+ 4;1590,1589,1638,1639;,
+ 4;1591,1590,1639,1640;,
+ 4;1592,1591,1640,1641;,
+ 4;1593,1592,1641,1642;,
+ 4;1594,1593,1642,1643;,
+ 4;1595,1594,1643,1644;,
+ 4;1596,1595,1644,1645;,
+ 4;1597,1596,1645,1646;,
+ 4;1598,1597,1646,1647;,
+ 4;1599,1598,1647,1648;,
+ 4;1600,1599,1648,1649;,
+ 4;1601,1600,1649,1650;,
+ 4;1602,1601,1650,1651;,
+ 4;1603,1602,1651,1652;,
+ 4;1604,1603,1652,1653;,
+ 4;1605,1604,1653,1654;,
+ 4;1606,1605,1654,1655;,
+ 4;1607,1606,1655,1656;,
+ 4;1607,1656,1657,1608;,
+ 4;1608,1657,1658,1609;,
+ 4;1609,1658,1659,1610;,
+ 4;1610,1659,1660,1611;,
+ 4;1611,1660,1661,1612;,
+ 4;1612,1661,1662,1613;,
+ 4;1613,1662,1663,1614;,
+ 4;1614,1663,1664,1615;,
+ 4;1615,1664,1665,1616;,
+ 4;1616,1665,1666,1617;,
+ 4;1617,1666,1667,1618;,
+ 4;1618,1667,1619,1570;,
+ 4;1619,1668,1669,1620;,
+ 4;1620,1669,1670,1621;,
+ 4;1621,1670,1671,1622;,
+ 4;1622,1671,1672,1623;,
+ 4;1623,1672,1673,1624;,
+ 4;1624,1673,1674,1625;,
+ 4;1625,1674,1675,1626;,
+ 4;1626,1675,1676,1627;,
+ 4;1627,1676,1677,1628;,
+ 4;1628,1677,1678,1629;,
+ 4;1629,1678,1679,1630;,
+ 4;1630,1679,1680,1631;,
+ 4;1633,1632,1681,1682;,
+ 4;1634,1633,1682,1683;,
+ 4;1635,1634,1683,1684;,
+ 4;1636,1635,1684,1685;,
+ 4;1637,1636,1685,1686;,
+ 4;1638,1637,1686,1687;,
+ 4;1639,1638,1687,1688;,
+ 4;1640,1639,1688,1689;,
+ 4;1641,1640,1689,1690;,
+ 4;1642,1641,1690,1691;,
+ 4;1643,1642,1691,1692;,
+ 4;1644,1643,1692,1693;,
+ 4;1645,1644,1693,1694;,
+ 4;1646,1645,1694,1695;,
+ 4;1647,1646,1695,1696;,
+ 4;1648,1647,1696,1697;,
+ 4;1649,1648,1697,1698;,
+ 4;1650,1649,1698,1699;,
+ 4;1651,1650,1699,1700;,
+ 4;1652,1651,1700,1701;,
+ 4;1653,1652,1701,1702;,
+ 4;1654,1653,1702,1703;,
+ 4;1655,1654,1703,1704;,
+ 4;1656,1655,1704,1705;,
+ 4;1656,1705,1706,1657;,
+ 4;1657,1706,1707,1658;,
+ 4;1658,1707,1708,1659;,
+ 4;1659,1708,1709,1660;,
+ 4;1660,1709,1710,1661;,
+ 4;1661,1710,1711,1662;,
+ 4;1662,1711,1712,1663;,
+ 4;1663,1712,1713,1664;,
+ 4;1664,1713,1714,1665;,
+ 4;1665,1714,1715,1666;,
+ 4;1666,1715,1716,1667;,
+ 4;1667,1716,1668,1619;,
+ 4;1668,1717,1718,1669;,
+ 4;1669,1718,1719,1670;,
+ 4;1670,1719,1720,1671;,
+ 4;1671,1720,1721,1672;,
+ 4;1672,1721,1722,1673;,
+ 4;1673,1722,1723,1674;,
+ 4;1674,1723,1724,1675;,
+ 4;1675,1724,1725,1676;,
+ 4;1676,1725,1726,1677;,
+ 4;1677,1726,1727,1678;,
+ 4;1678,1727,1728,1679;,
+ 4;1679,1728,1729,1680;,
+ 4;1682,1681,1730,1731;,
+ 4;1683,1682,1731,1732;,
+ 4;1684,1683,1732,1733;,
+ 4;1685,1684,1733,1734;,
+ 4;1686,1685,1734,1735;,
+ 4;1687,1686,1735,1736;,
+ 4;1688,1687,1736,1737;,
+ 4;1689,1688,1737,1738;,
+ 4;1690,1689,1738,1739;,
+ 4;1691,1690,1739,1740;,
+ 4;1692,1691,1740,1741;,
+ 4;1693,1692,1741,1742;,
+ 4;1694,1693,1742,1743;,
+ 4;1695,1694,1743,1744;,
+ 4;1696,1695,1744,1745;,
+ 4;1697,1696,1745,1746;,
+ 4;1698,1697,1746,1747;,
+ 4;1699,1698,1747,1748;,
+ 4;1700,1699,1748,1749;,
+ 4;1701,1700,1749,1750;,
+ 4;1702,1701,1750,1751;,
+ 4;1703,1702,1751,1752;,
+ 4;1704,1703,1752,1753;,
+ 4;1705,1704,1753,1754;,
+ 4;1705,1754,1755,1706;,
+ 4;1706,1755,1756,1707;,
+ 4;1707,1756,1757,1708;,
+ 4;1708,1757,1758,1709;,
+ 4;1709,1758,1759,1710;,
+ 4;1710,1759,1760,1711;,
+ 4;1711,1760,1761,1712;,
+ 4;1712,1761,1762,1713;,
+ 4;1713,1762,1763,1714;,
+ 4;1714,1763,1764,1715;,
+ 4;1715,1764,1765,1716;,
+ 4;1716,1765,1717,1668;,
+ 4;1717,1766,1767,1718;,
+ 4;1718,1767,1768,1719;,
+ 4;1719,1768,1769,1720;,
+ 4;1720,1769,1770,1721;,
+ 4;1721,1770,1771,1722;,
+ 4;1722,1771,1772,1723;,
+ 4;1723,1772,1773,1724;,
+ 4;1724,1773,1774,1725;,
+ 4;1725,1774,1775,1726;,
+ 4;1726,1775,1776,1727;,
+ 4;1727,1776,1777,1728;,
+ 4;1728,1777,1778,1729;,
+ 4;1731,1730,1779,1780;,
+ 4;1732,1731,1780,1781;,
+ 4;1733,1732,1781,1782;,
+ 4;1734,1733,1782,1783;,
+ 4;1735,1734,1783,1784;,
+ 4;1736,1735,1784,1785;,
+ 4;1737,1736,1785,1786;,
+ 4;1738,1737,1786,1787;,
+ 4;1739,1738,1787,1788;,
+ 4;1740,1739,1788,1789;,
+ 4;1741,1740,1789,1790;,
+ 4;1742,1741,1790,1791;,
+ 4;1743,1742,1791,1792;,
+ 4;1744,1743,1792,1793;,
+ 4;1745,1744,1793,1794;,
+ 4;1746,1745,1794,1795;,
+ 4;1747,1746,1795,1796;,
+ 4;1748,1747,1796,1797;,
+ 4;1749,1748,1797,1798;,
+ 4;1750,1749,1798,1799;,
+ 4;1751,1750,1799,1800;,
+ 4;1752,1751,1800,1801;,
+ 4;1753,1752,1801,1802;,
+ 4;1754,1753,1802,1803;,
+ 4;1754,1803,1804,1755;,
+ 4;1755,1804,1805,1756;,
+ 4;1756,1805,1806,1757;,
+ 4;1757,1806,1807,1758;,
+ 4;1758,1807,1808,1759;,
+ 4;1759,1808,1809,1760;,
+ 4;1760,1809,1810,1761;,
+ 4;1761,1810,1811,1762;,
+ 4;1762,1811,1812,1763;,
+ 4;1763,1812,1813,1764;,
+ 4;1764,1813,1814,1765;,
+ 4;1765,1814,1766,1717;,
+ 4;1766,1815,1816,1767;,
+ 4;1767,1816,1817,1768;,
+ 4;1768,1817,1818,1769;,
+ 4;1769,1818,1819,1770;,
+ 4;1770,1819,1820,1771;,
+ 4;1771,1820,1821,1772;,
+ 4;1772,1821,1822,1773;,
+ 4;1773,1822,1823,1774;,
+ 4;1774,1823,1824,1775;,
+ 4;1775,1824,1825,1776;,
+ 4;1776,1825,1826,1777;,
+ 4;1777,1826,1827,1778;,
+ 4;1780,1779,1828,1829;,
+ 4;1781,1780,1829,1830;,
+ 4;1782,1781,1830,1831;,
+ 4;1783,1782,1831,1832;,
+ 4;1784,1783,1832,1833;,
+ 4;1785,1784,1833,1834;,
+ 4;1786,1785,1834,1835;,
+ 4;1787,1786,1835,1836;,
+ 4;1788,1787,1836,1837;,
+ 4;1789,1788,1837,1838;,
+ 4;1790,1789,1838,1839;,
+ 4;1791,1790,1839,1840;,
+ 4;1792,1791,1840,1841;,
+ 4;1793,1792,1841,1842;,
+ 4;1794,1793,1842,1843;,
+ 4;1795,1794,1843,1844;,
+ 4;1796,1795,1844,1845;,
+ 4;1797,1796,1845,1846;,
+ 4;1798,1797,1846,1847;,
+ 4;1799,1798,1847,1848;,
+ 4;1800,1799,1848,1849;,
+ 4;1801,1800,1849,1850;,
+ 4;1802,1801,1850,1851;,
+ 4;1803,1802,1851,1852;,
+ 4;1803,1852,1853,1804;,
+ 4;1804,1853,1854,1805;,
+ 4;1805,1854,1855,1806;,
+ 4;1806,1855,1856,1807;,
+ 4;1807,1856,1857,1808;,
+ 4;1808,1857,1858,1809;,
+ 4;1809,1858,1859,1810;,
+ 4;1810,1859,1860,1811;,
+ 4;1811,1860,1861,1812;,
+ 4;1812,1861,1862,1813;,
+ 4;1813,1862,1863,1814;,
+ 4;1814,1863,1815,1766;,
+ 4;1815,1864,1865,1816;,
+ 4;1816,1865,1866,1817;,
+ 4;1817,1866,1867,1818;,
+ 4;1818,1867,1868,1819;,
+ 4;1819,1868,1869,1820;,
+ 4;1820,1869,1870,1821;,
+ 4;1821,1870,1871,1822;,
+ 4;1822,1871,1872,1823;,
+ 4;1823,1872,1873,1824;,
+ 4;1824,1873,1874,1825;,
+ 4;1825,1874,1875,1826;,
+ 4;1826,1875,1876,1827;,
+ 4;1829,1828,1877,1878;,
+ 4;1830,1829,1878,1879;,
+ 4;1831,1830,1879,1880;,
+ 4;1832,1831,1880,1881;,
+ 4;1833,1832,1881,1882;,
+ 4;1834,1833,1882,1883;,
+ 4;1835,1834,1883,1884;,
+ 4;1836,1835,1884,1885;,
+ 4;1837,1836,1885,1886;,
+ 4;1838,1837,1886,1887;,
+ 4;1839,1838,1887,1888;,
+ 4;1840,1839,1888,1889;,
+ 4;1841,1840,1889,1890;,
+ 4;1842,1841,1890,1891;,
+ 4;1843,1842,1891,1892;,
+ 4;1844,1843,1892,1893;,
+ 4;1845,1844,1893,1894;,
+ 4;1846,1845,1894,1895;,
+ 4;1847,1846,1895,1896;,
+ 4;1848,1847,1896,1897;,
+ 4;1849,1848,1897,1898;,
+ 4;1850,1849,1898,1899;,
+ 4;1851,1850,1899,1900;,
+ 4;1852,1851,1900,1901;,
+ 4;1852,1901,1902,1853;,
+ 4;1853,1902,1903,1854;,
+ 4;1854,1903,1904,1855;,
+ 4;1855,1904,1905,1856;,
+ 4;1856,1905,1906,1857;,
+ 4;1857,1906,1907,1858;,
+ 4;1858,1907,1908,1859;,
+ 4;1859,1908,1909,1860;,
+ 4;1860,1909,1910,1861;,
+ 4;1861,1910,1911,1862;,
+ 4;1862,1911,1912,1863;,
+ 4;1863,1912,1864,1815;,
+ 4;1864,1913,1914,1865;,
+ 4;1865,1914,1915,1866;,
+ 4;1866,1915,1916,1867;,
+ 4;1867,1916,1917,1868;,
+ 4;1868,1917,1918,1869;,
+ 4;1869,1918,1919,1870;,
+ 4;1870,1919,1920,1871;,
+ 4;1871,1920,1921,1872;,
+ 4;1872,1921,1922,1873;,
+ 4;1873,1922,1923,1874;,
+ 4;1874,1923,1924,1875;,
+ 4;1875,1924,1925,1876;,
+ 4;1878,1877,1926,1927;,
+ 4;1879,1878,1927,1928;,
+ 4;1880,1879,1928,1929;,
+ 4;1881,1880,1929,1930;,
+ 4;1882,1881,1930,1931;,
+ 4;1883,1882,1931,1932;,
+ 4;1884,1883,1932,1933;,
+ 4;1885,1884,1933,1934;,
+ 4;1886,1885,1934,1935;,
+ 4;1887,1886,1935,1936;,
+ 4;1888,1887,1936,1937;,
+ 4;1889,1888,1937,1938;,
+ 4;1890,1889,1938,1939;,
+ 4;1891,1890,1939,1940;,
+ 4;1892,1891,1940,1941;,
+ 4;1893,1892,1941,1942;,
+ 4;1894,1893,1942,1943;,
+ 4;1895,1894,1943,1944;,
+ 4;1896,1895,1944,1945;,
+ 4;1897,1896,1945,1946;,
+ 4;1898,1897,1946,1947;,
+ 4;1899,1898,1947,1948;,
+ 4;1900,1899,1948,1949;,
+ 4;1901,1900,1949,1950;,
+ 4;1901,1950,1951,1902;,
+ 4;1902,1951,1952,1903;,
+ 4;1903,1952,1953,1904;,
+ 4;1904,1953,1954,1905;,
+ 4;1905,1954,1955,1906;,
+ 4;1906,1955,1956,1907;,
+ 4;1907,1956,1957,1908;,
+ 4;1908,1957,1958,1909;,
+ 4;1909,1958,1959,1910;,
+ 4;1910,1959,1960,1911;,
+ 4;1911,1960,1961,1912;,
+ 4;1912,1961,1913,1864;,
+ 4;1913,1962,1963,1914;,
+ 4;1914,1963,1964,1915;,
+ 4;1915,1964,1965,1916;,
+ 4;1916,1965,1966,1917;,
+ 4;1917,1966,1967,1918;,
+ 4;1918,1967,1968,1919;,
+ 4;1919,1968,1969,1920;,
+ 4;1920,1969,1970,1921;,
+ 4;1921,1970,1971,1922;,
+ 4;1922,1971,1972,1923;,
+ 4;1923,1972,1973,1924;,
+ 4;1924,1973,1974,1925;,
+ 4;1927,1926,1975,1976;,
+ 4;1928,1927,1976,1977;,
+ 4;1929,1928,1977,1978;,
+ 4;1930,1929,1978,1979;,
+ 4;1931,1930,1979,1980;,
+ 4;1932,1931,1980,1981;,
+ 4;1933,1932,1981,1982;,
+ 4;1934,1933,1982,1983;,
+ 4;1935,1934,1983,1984;,
+ 4;1936,1935,1984,1985;,
+ 4;1937,1936,1985,1986;,
+ 4;1938,1937,1986,1987;,
+ 4;1939,1938,1987,1988;,
+ 4;1940,1939,1988,1989;,
+ 4;1941,1940,1989,1990;,
+ 4;1942,1941,1990,1991;,
+ 4;1943,1942,1991,1992;,
+ 4;1944,1943,1992,1993;,
+ 4;1945,1944,1993,1994;,
+ 4;1946,1945,1994,1995;,
+ 4;1947,1946,1995,1996;,
+ 4;1948,1947,1996,1997;,
+ 4;1949,1948,1997,1998;,
+ 4;1950,1949,1998,1999;,
+ 4;1950,1999,2000,1951;,
+ 4;1951,2000,2001,1952;,
+ 4;1952,2001,2002,1953;,
+ 4;1953,2002,2003,1954;,
+ 4;1954,2003,2004,1955;,
+ 4;1955,2004,2005,1956;,
+ 4;1956,2005,2006,1957;,
+ 4;1957,2006,2007,1958;,
+ 4;1958,2007,2008,1959;,
+ 4;1959,2008,2009,1960;,
+ 4;1960,2009,2010,1961;,
+ 4;1961,2010,1962,1913;,
+ 4;1962,2011,2012,1963;,
+ 4;1963,2012,2013,1964;,
+ 4;1964,2013,2014,1965;,
+ 4;1965,2014,2015,1966;,
+ 4;1966,2015,2016,1967;,
+ 4;1967,2016,2017,1968;,
+ 4;1968,2017,2018,1969;,
+ 4;1969,2018,2019,1970;,
+ 4;1970,2019,2020,1971;,
+ 4;1971,2020,2021,1972;,
+ 4;1972,2021,2022,1973;,
+ 4;1973,2022,2023,1974;,
+ 4;1976,1975,2024,2025;,
+ 4;1977,1976,2025,2026;,
+ 4;1978,1977,2026,2027;,
+ 4;1979,1978,2027,2028;,
+ 4;1980,1979,2028,2029;,
+ 4;1981,1980,2029,2030;,
+ 4;1982,1981,2030,2031;,
+ 4;1983,1982,2031,2032;,
+ 4;1984,1983,2032,2033;,
+ 4;1985,1984,2033,2034;,
+ 4;1986,1985,2034,2035;,
+ 4;1987,1986,2035,2036;,
+ 4;1988,1987,2036,2037;,
+ 4;1989,1988,2037,2038;,
+ 4;1990,1989,2038,2039;,
+ 4;1991,1990,2039,2040;,
+ 4;1992,1991,2040,2041;,
+ 4;1993,1992,2041,2042;,
+ 4;1994,1993,2042,2043;,
+ 4;1995,1994,2043,2044;,
+ 4;1996,1995,2044,2045;,
+ 4;1997,1996,2045,2046;,
+ 4;1998,1997,2046,2047;,
+ 4;1999,1998,2047,2048;,
+ 4;1999,2048,2049,2000;,
+ 4;2000,2049,2050,2001;,
+ 4;2001,2050,2051,2002;,
+ 4;2002,2051,2052,2003;,
+ 4;2003,2052,2053,2004;,
+ 4;2004,2053,2054,2005;,
+ 4;2005,2054,2055,2006;,
+ 4;2006,2055,2056,2007;,
+ 4;2007,2056,2057,2008;,
+ 4;2008,2057,2058,2009;,
+ 4;2009,2058,2059,2010;,
+ 4;2010,2059,2011,1962;,
+ 4;2011,2060,2061,2012;,
+ 4;2012,2061,2062,2013;,
+ 4;2013,2062,2063,2014;,
+ 4;2014,2063,2064,2015;,
+ 4;2015,2064,2065,2016;,
+ 4;2016,2065,2066,2017;,
+ 4;2017,2066,2067,2018;,
+ 4;2018,2067,2068,2019;,
+ 4;2019,2068,2069,2020;,
+ 4;2020,2069,2070,2021;,
+ 4;2021,2070,2071,2022;,
+ 4;2022,2071,2072,2023;,
+ 4;2025,2024,2073,2074;,
+ 4;2026,2025,2074,2075;,
+ 4;2027,2026,2075,2076;,
+ 4;2028,2027,2076,2077;,
+ 4;2029,2028,2077,2078;,
+ 4;2030,2029,2078,2079;,
+ 4;2031,2030,2079,2080;,
+ 4;2032,2031,2080,2081;,
+ 4;2033,2032,2081,2082;,
+ 4;2034,2033,2082,2083;,
+ 4;2035,2034,2083,2084;,
+ 4;2036,2035,2084,2085;,
+ 4;2037,2036,2085,2086;,
+ 4;2038,2037,2086,2087;,
+ 4;2039,2038,2087,2088;,
+ 4;2040,2039,2088,2089;,
+ 4;2041,2040,2089,2090;,
+ 4;2042,2041,2090,2091;,
+ 4;2043,2042,2091,2092;,
+ 4;2044,2043,2092,2093;,
+ 4;2045,2044,2093,2094;,
+ 4;2046,2045,2094,2095;,
+ 4;2047,2046,2095,2096;,
+ 4;2048,2047,2096,2097;,
+ 4;2048,2097,2098,2049;,
+ 4;2049,2098,2099,2050;,
+ 4;2050,2099,2100,2051;,
+ 4;2051,2100,2101,2052;,
+ 4;2052,2101,2102,2053;,
+ 4;2053,2102,2103,2054;,
+ 4;2054,2103,2104,2055;,
+ 4;2055,2104,2105,2056;,
+ 4;2056,2105,2106,2057;,
+ 4;2057,2106,2107,2058;,
+ 4;2058,2107,2108,2059;,
+ 4;2059,2108,2060,2011;,
+ 4;2060,2109,2110,2061;,
+ 4;2061,2110,2111,2062;,
+ 4;2062,2111,2112,2063;,
+ 4;2063,2112,2113,2064;,
+ 4;2064,2113,2114,2065;,
+ 4;2065,2114,2115,2066;,
+ 4;2066,2115,2116,2067;,
+ 4;2067,2116,2117,2068;,
+ 4;2068,2117,2118,2069;,
+ 4;2069,2118,2119,2070;,
+ 4;2070,2119,2120,2071;,
+ 4;2071,2120,2121,2072;,
+ 4;2074,2073,2122,2123;,
+ 4;2075,2074,2123,2124;,
+ 4;2076,2075,2124,2125;,
+ 4;2077,2076,2125,2126;,
+ 4;2078,2077,2126,2127;,
+ 4;2079,2078,2127,2128;,
+ 4;2080,2079,2128,2129;,
+ 4;2081,2080,2129,2130;,
+ 4;2082,2081,2130,2131;,
+ 4;2083,2082,2131,2132;,
+ 4;2084,2083,2132,2133;,
+ 4;2085,2084,2133,2134;,
+ 4;2086,2085,2134,2135;,
+ 4;2087,2086,2135,2136;,
+ 4;2088,2087,2136,2137;,
+ 4;2089,2088,2137,2138;,
+ 4;2090,2089,2138,2139;,
+ 4;2091,2090,2139,2140;,
+ 4;2092,2091,2140,2141;,
+ 4;2093,2092,2141,2142;,
+ 4;2094,2093,2142,2143;,
+ 4;2095,2094,2143,2144;,
+ 4;2096,2095,2144,2145;,
+ 4;2097,2096,2145,2146;,
+ 4;2097,2146,2147,2098;,
+ 4;2098,2147,2148,2099;,
+ 4;2099,2148,2149,2100;,
+ 4;2100,2149,2150,2101;,
+ 4;2101,2150,2151,2102;,
+ 4;2102,2151,2152,2103;,
+ 4;2103,2152,2153,2104;,
+ 4;2104,2153,2154,2105;,
+ 4;2105,2154,2155,2106;,
+ 4;2106,2155,2156,2107;,
+ 4;2107,2156,2157,2108;,
+ 4;2108,2157,2109,2060;,
+ 4;2109,2158,2159,2110;,
+ 4;2110,2159,2160,2111;,
+ 4;2111,2160,2161,2112;,
+ 4;2112,2161,2162,2113;,
+ 4;2113,2162,2163,2114;,
+ 4;2114,2163,2164,2115;,
+ 4;2115,2164,2165,2116;,
+ 4;2116,2165,2166,2117;,
+ 4;2117,2166,2167,2118;,
+ 4;2118,2167,2168,2119;,
+ 4;2119,2168,2169,2120;,
+ 4;2120,2169,2170,2121;,
+ 4;2123,2122,2171,2172;,
+ 4;2124,2123,2172,2173;,
+ 4;2125,2124,2173,2174;,
+ 4;2126,2125,2174,2175;,
+ 4;2127,2126,2175,2176;,
+ 4;2128,2127,2176,2177;,
+ 4;2129,2128,2177,2178;,
+ 4;2130,2129,2178,2179;,
+ 4;2131,2130,2179,2180;,
+ 4;2132,2131,2180,2181;,
+ 4;2133,2132,2181,2182;,
+ 4;2134,2133,2182,2183;,
+ 4;2135,2134,2183,2184;,
+ 4;2136,2135,2184,2185;,
+ 4;2137,2136,2185,2186;,
+ 4;2138,2137,2186,2187;,
+ 4;2139,2138,2187,2188;,
+ 4;2140,2139,2188,2189;,
+ 4;2141,2140,2189,2190;,
+ 4;2142,2141,2190,2191;,
+ 4;2143,2142,2191,2192;,
+ 4;2144,2143,2192,2193;,
+ 4;2145,2144,2193,2194;,
+ 4;2146,2145,2194,2195;,
+ 4;2146,2195,2196,2147;,
+ 4;2147,2196,2197,2148;,
+ 4;2148,2197,2198,2149;,
+ 4;2149,2198,2199,2150;,
+ 4;2150,2199,2200,2151;,
+ 4;2151,2200,2201,2152;,
+ 4;2152,2201,2202,2153;,
+ 4;2153,2202,2203,2154;,
+ 4;2154,2203,2204,2155;,
+ 4;2155,2204,2205,2156;,
+ 4;2156,2205,2206,2157;,
+ 4;2157,2206,2158,2109;,
+ 4;2158,2207,2208,2159;,
+ 4;2159,2208,2209,2160;,
+ 4;2160,2209,2210,2161;,
+ 4;2161,2210,2211,2162;,
+ 4;2162,2211,2212,2163;,
+ 4;2163,2212,2213,2164;,
+ 4;2164,2213,2214,2165;,
+ 4;2165,2214,2215,2166;,
+ 4;2166,2215,2216,2167;,
+ 4;2167,2216,2217,2168;,
+ 4;2168,2217,2218,2169;,
+ 4;2169,2218,2219,2170;,
+ 4;2172,2171,2220,2221;,
+ 4;2173,2172,2221,2222;,
+ 4;2174,2173,2222,2223;,
+ 4;2175,2174,2223,2224;,
+ 4;2176,2175,2224,2225;,
+ 4;2177,2176,2225,2226;,
+ 4;2178,2177,2226,2227;,
+ 4;2179,2178,2227,2228;,
+ 4;2180,2179,2228,2229;,
+ 4;2181,2180,2229,2230;,
+ 4;2182,2181,2230,2231;,
+ 4;2183,2182,2231,2232;,
+ 4;2184,2183,2232,2233;,
+ 4;2185,2184,2233,2234;,
+ 4;2186,2185,2234,2235;,
+ 4;2187,2186,2235,2236;,
+ 4;2188,2187,2236,2237;,
+ 4;2189,2188,2237,2238;,
+ 4;2190,2189,2238,2239;,
+ 4;2191,2190,2239,2240;,
+ 4;2192,2191,2240,2241;,
+ 4;2193,2192,2241,2242;,
+ 4;2194,2193,2242,2243;,
+ 4;2195,2194,2243,2244;,
+ 4;2195,2244,2245,2196;,
+ 4;2196,2245,2246,2197;,
+ 4;2197,2246,2247,2198;,
+ 4;2198,2247,2248,2199;,
+ 4;2199,2248,2249,2200;,
+ 4;2200,2249,2250,2201;,
+ 4;2201,2250,2251,2202;,
+ 4;2202,2251,2252,2203;,
+ 4;2203,2252,2253,2204;,
+ 4;2204,2253,2254,2205;,
+ 4;2205,2254,2255,2206;,
+ 4;2206,2255,2207,2158;,
+ 4;2207,2256,2257,2208;,
+ 4;2208,2257,2258,2209;,
+ 4;2209,2258,2259,2210;,
+ 4;2210,2259,2260,2211;,
+ 4;2211,2260,2261,2212;,
+ 4;2212,2261,2262,2213;,
+ 4;2213,2262,2263,2214;,
+ 4;2214,2263,2264,2215;,
+ 4;2215,2264,2265,2216;,
+ 4;2216,2265,2266,2217;,
+ 4;2217,2266,2267,2218;,
+ 4;2218,2267,2269,2219;,
+ 4;2221,2220,2268,2270;,
+ 4;2222,2221,2270,2271;,
+ 4;2223,2222,2271,2272;,
+ 4;2224,2223,2272,2273;,
+ 4;2225,2224,2273,2274;,
+ 4;2226,2225,2274,2275;,
+ 4;2227,2226,2275,2276;,
+ 4;2228,2227,2276,2277;,
+ 4;2229,2228,2277,2278;,
+ 4;2230,2229,2278,2279;,
+ 4;2231,2230,2279,2280;,
+ 4;2232,2231,2280,2281;,
+ 4;2233,2232,2281,2282;,
+ 4;2234,2233,2282,2283;,
+ 4;2235,2234,2283,2284;,
+ 4;2236,2235,2284,2285;,
+ 4;2237,2236,2285,2286;,
+ 4;2238,2237,2286,2287;,
+ 4;2239,2238,2287,2288;,
+ 4;2240,2239,2288,2289;,
+ 4;2241,2240,2289,2290;,
+ 4;2242,2241,2290,2291;,
+ 4;2243,2242,2291,2292;,
+ 4;2244,2243,2292,2293;,
+ 4;2244,2293,2294,2245;,
+ 4;2245,2294,2295,2246;,
+ 4;2246,2295,2296,2247;,
+ 4;2247,2296,2297,2248;,
+ 4;2248,2297,2298,2249;,
+ 4;2249,2298,2299,2250;,
+ 4;2250,2299,2300,2251;,
+ 4;2251,2300,2301,2252;,
+ 4;2252,2301,2302,2253;,
+ 4;2253,2302,2303,2254;,
+ 4;2254,2303,2304,2255;,
+ 4;2255,2304,2256,2207;,
+ 4;46,95,96,47;,
+ 4;45,94,95,46;,
+ 4;44,93,94,45;,
+ 4;43,92,93,44;,
+ 4;42,91,92,43;,
+ 4;41,90,91,42;,
+ 4;40,89,90,41;,
+ 4;39,88,89,40;,
+ 4;39,38,87,88;,
+ 4;38,37,86,87;,
+ 4;37,36,85,86;,
+ 4;36,35,84,85;,
+ 4;35,34,83,84;,
+ 4;34,33,82,83;,
+ 4;33,32,81,82;,
+ 4;32,31,80,81;,
+ 4;31,30,79,80;,
+ 4;30,29,78,79;,
+ 4;29,28,77,78;,
+ 4;28,27,76,77;,
+ 4;27,26,75,76;,
+ 4;26,25,74,75;,
+ 4;25,24,73,74;,
+ 4;24,23,72,73;,
+ 4;23,22,71,72;,
+ 4;22,21,70,71;,
+ 4;21,20,69,70;,
+ 4;20,19,68,69;,
+ 4;19,18,67,68;,
+ 4;18,17,66,67;,
+ 4;17,16,65,66;,
+ 4;16,15,64,65;,
+ 4;13,62,63,14;,
+ 4;12,61,62,13;,
+ 4;11,60,61,12;,
+ 4;10,59,60,11;,
+ 4;9,58,59,10;,
+ 4;8,57,58,9;,
+ 4;7,56,57,8;,
+ 4;6,55,56,7;,
+ 4;5,54,55,6;,
+ 4;4,53,54,5;,
+ 4;3,52,53,4;,
+ 4;2,51,52,3;,
+ 4;1153,1152,1201,1202;,
+ 4;1154,1153,1202,1203;,
+ 4;1128,1177,1129,1080;,
+ 4;1129,1178,1179,1130;;
+
+ MeshNormals {
+ 2307;
+ -0.000000;-1.000000;0.000000;,
+ -0.000000;-1.000000;0.000000;,
+ 0.065403;-0.997859;0.000000;,
+ 0.064843;-0.997859;0.008537;,
+ 0.063174;-0.997859;0.016927;,
+ 0.060424;-0.997859;0.025029;,
+ 0.056640;-0.997859;0.032701;,
+ 0.051887;-0.997859;0.039815;,
+ 0.046247;-0.997859;0.046247;,
+ 0.039815;-0.997859;0.051887;,
+ 0.032701;-0.997859;0.056640;,
+ 0.025029;-0.997859;0.060424;,
+ 0.016927;-0.997859;0.063174;,
+ 0.008537;-0.997859;0.064843;,
+ 0.000000;-0.997859;0.065403;,
+ 0.000000;-0.997859;0.065403;,
+ -0.008537;-0.997859;0.064843;,
+ -0.016927;-0.997859;0.063174;,
+ -0.025029;-0.997859;0.060424;,
+ -0.032701;-0.997859;0.056640;,
+ -0.039815;-0.997859;0.051887;,
+ -0.046247;-0.997859;0.046247;,
+ -0.051887;-0.997859;0.039815;,
+ -0.056640;-0.997859;0.032701;,
+ -0.060424;-0.997859;0.025029;,
+ -0.063174;-0.997859;0.016927;,
+ -0.064843;-0.997859;0.008537;,
+ -0.065403;-0.997859;0.000000;,
+ -0.064843;-0.997859;-0.008537;,
+ -0.063174;-0.997859;-0.016927;,
+ -0.060424;-0.997859;-0.025029;,
+ -0.056640;-0.997859;-0.032701;,
+ -0.051887;-0.997859;-0.039815;,
+ -0.046247;-0.997859;-0.046247;,
+ -0.039815;-0.997859;-0.051887;,
+ -0.032701;-0.997859;-0.056640;,
+ -0.025029;-0.997859;-0.060424;,
+ -0.016927;-0.997859;-0.063174;,
+ -0.008537;-0.997859;-0.064843;,
+ 0.000000;-0.997859;-0.065403;,
+ 0.008537;-0.997859;-0.064843;,
+ 0.016927;-0.997859;-0.063174;,
+ 0.025029;-0.997859;-0.060424;,
+ 0.032701;-0.997859;-0.056640;,
+ 0.039815;-0.997859;-0.051887;,
+ 0.046247;-0.997859;-0.046247;,
+ 0.051887;-0.997859;-0.039815;,
+ 0.056640;-0.997859;-0.032701;,
+ 0.060424;-0.997859;-0.025029;,
+ 0.063174;-0.997859;-0.016927;,
+ 0.064843;-0.997859;-0.008537;,
+ 0.130526;-0.991445;-0.000000;,
+ 0.129409;-0.991445;0.017037;,
+ 0.126078;-0.991445;0.033783;,
+ 0.120590;-0.991445;0.049950;,
+ 0.113039;-0.991445;0.065263;,
+ 0.103553;-0.991445;0.079459;,
+ 0.092296;-0.991445;0.092296;,
+ 0.079459;-0.991445;0.103553;,
+ 0.065263;-0.991445;0.113039;,
+ 0.049950;-0.991445;0.120590;,
+ 0.033783;-0.991445;0.126078;,
+ 0.017037;-0.991445;0.129409;,
+ 0.000000;-0.991445;0.130526;,
+ 0.000000;-0.991445;0.130526;,
+ -0.017037;-0.991445;0.129409;,
+ -0.033783;-0.991445;0.126078;,
+ -0.049950;-0.991445;0.120590;,
+ -0.065263;-0.991445;0.113039;,
+ -0.079459;-0.991445;0.103553;,
+ -0.092296;-0.991445;0.092296;,
+ -0.103553;-0.991445;0.079459;,
+ -0.113039;-0.991445;0.065263;,
+ -0.120590;-0.991445;0.049950;,
+ -0.126078;-0.991445;0.033783;,
+ -0.129409;-0.991445;0.017037;,
+ -0.130526;-0.991445;-0.000000;,
+ -0.129409;-0.991445;-0.017037;,
+ -0.126078;-0.991445;-0.033783;,
+ -0.120590;-0.991445;-0.049950;,
+ -0.113039;-0.991445;-0.065263;,
+ -0.103553;-0.991445;-0.079459;,
+ -0.092296;-0.991445;-0.092296;,
+ -0.079459;-0.991445;-0.103553;,
+ -0.065263;-0.991445;-0.113039;,
+ -0.049950;-0.991445;-0.120590;,
+ -0.033783;-0.991445;-0.126078;,
+ -0.017037;-0.991445;-0.129409;,
+ 0.000000;-0.991445;-0.130526;,
+ 0.017037;-0.991445;-0.129409;,
+ 0.033783;-0.991445;-0.126078;,
+ 0.049950;-0.991445;-0.120590;,
+ 0.065263;-0.991445;-0.113039;,
+ 0.079459;-0.991445;-0.103553;,
+ 0.092296;-0.991445;-0.092296;,
+ 0.103553;-0.991445;-0.079459;,
+ 0.113039;-0.991445;-0.065263;,
+ 0.120590;-0.991445;-0.049950;,
+ 0.126078;-0.991445;-0.033783;,
+ 0.129409;-0.991445;-0.017037;,
+ 0.195090;-0.980785;-0.000000;,
+ 0.193421;-0.980785;0.025464;,
+ 0.188442;-0.980785;0.050493;,
+ 0.180239;-0.980785;0.074658;,
+ 0.168953;-0.980785;0.097545;,
+ 0.154775;-0.980785;0.118763;,
+ 0.137949;-0.980785;0.137949;,
+ 0.118763;-0.980785;0.154775;,
+ 0.097545;-0.980785;0.168953;,
+ 0.074658;-0.980785;0.180239;,
+ 0.050493;-0.980785;0.188442;,
+ 0.025464;-0.980785;0.193421;,
+ 0.000000;-0.980785;0.195090;,
+ 0.000000;-0.980785;0.195090;,
+ -0.025464;-0.980785;0.193421;,
+ -0.050493;-0.980785;0.188442;,
+ -0.074658;-0.980785;0.180239;,
+ -0.097545;-0.980785;0.168953;,
+ -0.118763;-0.980785;0.154775;,
+ -0.137949;-0.980785;0.137949;,
+ -0.154775;-0.980785;0.118763;,
+ -0.168953;-0.980785;0.097545;,
+ -0.180239;-0.980785;0.074658;,
+ -0.188442;-0.980785;0.050493;,
+ -0.193421;-0.980785;0.025464;,
+ -0.195090;-0.980785;-0.000000;,
+ -0.193421;-0.980785;-0.025464;,
+ -0.188442;-0.980785;-0.050493;,
+ -0.180239;-0.980785;-0.074658;,
+ -0.168953;-0.980785;-0.097545;,
+ -0.154775;-0.980785;-0.118763;,
+ -0.137949;-0.980785;-0.137949;,
+ -0.118763;-0.980785;-0.154775;,
+ -0.097545;-0.980785;-0.168953;,
+ -0.074658;-0.980785;-0.180239;,
+ -0.050493;-0.980785;-0.188442;,
+ -0.025464;-0.980785;-0.193421;,
+ 0.000000;-0.980785;-0.195090;,
+ 0.025464;-0.980785;-0.193421;,
+ 0.050493;-0.980785;-0.188442;,
+ 0.074658;-0.980785;-0.180239;,
+ 0.097545;-0.980785;-0.168953;,
+ 0.118763;-0.980785;-0.154775;,
+ 0.137949;-0.980785;-0.137949;,
+ 0.154775;-0.980785;-0.118763;,
+ 0.168953;-0.980785;-0.097545;,
+ 0.180239;-0.980785;-0.074658;,
+ 0.188442;-0.980785;-0.050493;,
+ 0.193421;-0.980785;-0.025464;,
+ 0.258818;-0.965926;-0.000000;,
+ 0.256604;-0.965926;0.033783;,
+ 0.249999;-0.965926;0.066987;,
+ 0.239117;-0.965926;0.099045;,
+ 0.224143;-0.965926;0.129409;,
+ 0.205334;-0.965926;0.157558;,
+ 0.183012;-0.965926;0.183012;,
+ 0.157558;-0.965926;0.205334;,
+ 0.129409;-0.965926;0.224143;,
+ 0.099045;-0.965926;0.239117;,
+ 0.066987;-0.965926;0.249999;,
+ 0.033783;-0.965926;0.256604;,
+ 0.000000;-0.965926;0.258818;,
+ 0.000000;-0.965926;0.258818;,
+ -0.033783;-0.965926;0.256604;,
+ -0.066987;-0.965926;0.249999;,
+ -0.099045;-0.965926;0.239117;,
+ -0.129409;-0.965926;0.224143;,
+ -0.157558;-0.965926;0.205334;,
+ -0.183012;-0.965926;0.183012;,
+ -0.205334;-0.965926;0.157558;,
+ -0.224143;-0.965926;0.129409;,
+ -0.239117;-0.965926;0.099045;,
+ -0.249999;-0.965926;0.066987;,
+ -0.256604;-0.965926;0.033783;,
+ -0.258818;-0.965926;-0.000000;,
+ -0.256604;-0.965926;-0.033783;,
+ -0.249999;-0.965926;-0.066987;,
+ -0.239117;-0.965926;-0.099045;,
+ -0.224143;-0.965926;-0.129409;,
+ -0.205334;-0.965926;-0.157558;,
+ -0.183012;-0.965926;-0.183012;,
+ -0.157558;-0.965926;-0.205334;,
+ -0.129409;-0.965926;-0.224143;,
+ -0.099045;-0.965926;-0.239117;,
+ -0.066987;-0.965926;-0.249999;,
+ -0.033783;-0.965926;-0.256604;,
+ 0.000000;-0.965926;-0.258818;,
+ 0.033783;-0.965926;-0.256604;,
+ 0.066987;-0.965926;-0.249999;,
+ 0.099045;-0.965926;-0.239117;,
+ 0.129409;-0.965926;-0.224143;,
+ 0.157558;-0.965926;-0.205334;,
+ 0.183012;-0.965926;-0.183012;,
+ 0.205334;-0.965926;-0.157558;,
+ 0.224143;-0.965926;-0.129409;,
+ 0.239117;-0.965926;-0.099045;,
+ 0.249999;-0.965926;-0.066987;,
+ 0.256604;-0.965926;-0.033783;,
+ 0.321438;-0.946931;0.000000;,
+ 0.318688;-0.946931;0.041956;,
+ 0.310486;-0.946931;0.083194;,
+ 0.296970;-0.946931;0.123009;,
+ 0.278374;-0.946931;0.160719;,
+ 0.255014;-0.946931;0.195679;,
+ 0.227291;-0.946931;0.227291;,
+ 0.195679;-0.946931;0.255014;,
+ 0.160719;-0.946931;0.278374;,
+ 0.123009;-0.946931;0.296970;,
+ 0.083194;-0.946931;0.310486;,
+ 0.041956;-0.946931;0.318688;,
+ 0.000000;-0.946931;0.321438;,
+ 0.000000;-0.946931;0.321438;,
+ -0.041956;-0.946931;0.318688;,
+ -0.083194;-0.946931;0.310486;,
+ -0.123009;-0.946931;0.296970;,
+ -0.160719;-0.946931;0.278374;,
+ -0.195679;-0.946931;0.255014;,
+ -0.227291;-0.946931;0.227291;,
+ -0.255014;-0.946931;0.195679;,
+ -0.278374;-0.946931;0.160719;,
+ -0.296970;-0.946931;0.123009;,
+ -0.310486;-0.946931;0.083194;,
+ -0.318688;-0.946931;0.041956;,
+ -0.321438;-0.946931;0.000000;,
+ -0.318688;-0.946931;-0.041956;,
+ -0.310486;-0.946931;-0.083194;,
+ -0.296970;-0.946931;-0.123009;,
+ -0.278374;-0.946931;-0.160719;,
+ -0.255014;-0.946931;-0.195679;,
+ -0.227291;-0.946931;-0.227291;,
+ -0.195679;-0.946931;-0.255014;,
+ -0.160719;-0.946931;-0.278374;,
+ -0.123009;-0.946931;-0.296970;,
+ -0.083194;-0.946931;-0.310486;,
+ -0.041956;-0.946931;-0.318688;,
+ 0.000000;-0.946931;-0.321438;,
+ 0.041956;-0.946931;-0.318688;,
+ 0.083194;-0.946931;-0.310486;,
+ 0.123009;-0.946931;-0.296970;,
+ 0.160719;-0.946931;-0.278374;,
+ 0.195679;-0.946931;-0.255014;,
+ 0.227291;-0.946931;-0.227291;,
+ 0.255014;-0.946931;-0.195679;,
+ 0.278374;-0.946931;-0.160719;,
+ 0.296970;-0.946931;-0.123009;,
+ 0.310486;-0.946931;-0.083194;,
+ 0.318688;-0.946931;-0.041956;,
+ 0.382682;-0.923880;0.000000;,
+ 0.379408;-0.923880;0.049950;,
+ 0.369642;-0.923880;0.099045;,
+ 0.353552;-0.923880;0.146446;,
+ 0.331412;-0.923880;0.191341;,
+ 0.303602;-0.923880;0.232962;,
+ 0.270597;-0.923880;0.270597;,
+ 0.232962;-0.923880;0.303602;,
+ 0.191341;-0.923880;0.331412;,
+ 0.146446;-0.923880;0.353552;,
+ 0.099045;-0.923880;0.369642;,
+ 0.049950;-0.923880;0.379408;,
+ 0.000000;-0.923880;0.382682;,
+ 0.000000;-0.923880;0.382682;,
+ -0.049950;-0.923880;0.379408;,
+ -0.099045;-0.923880;0.369642;,
+ -0.146446;-0.923880;0.353552;,
+ -0.191341;-0.923880;0.331412;,
+ -0.232962;-0.923880;0.303602;,
+ -0.270597;-0.923880;0.270597;,
+ -0.303602;-0.923880;0.232962;,
+ -0.331412;-0.923880;0.191341;,
+ -0.353552;-0.923880;0.146446;,
+ -0.369642;-0.923880;0.099045;,
+ -0.379408;-0.923880;0.049950;,
+ -0.382682;-0.923880;0.000000;,
+ -0.379408;-0.923880;-0.049950;,
+ -0.369642;-0.923880;-0.099045;,
+ -0.353552;-0.923880;-0.146446;,
+ -0.331412;-0.923880;-0.191341;,
+ -0.303602;-0.923880;-0.232962;,
+ -0.270597;-0.923880;-0.270597;,
+ -0.232962;-0.923880;-0.303602;,
+ -0.191341;-0.923880;-0.331412;,
+ -0.146446;-0.923880;-0.353552;,
+ -0.099045;-0.923880;-0.369642;,
+ -0.049950;-0.923880;-0.379408;,
+ 0.000000;-0.923880;-0.382682;,
+ 0.049950;-0.923880;-0.379408;,
+ 0.099045;-0.923880;-0.369642;,
+ 0.146446;-0.923880;-0.353552;,
+ 0.191341;-0.923880;-0.331412;,
+ 0.232962;-0.923880;-0.303602;,
+ 0.270597;-0.923880;-0.270597;,
+ 0.303602;-0.923880;-0.232962;,
+ 0.331412;-0.923880;-0.191341;,
+ 0.353552;-0.923880;-0.146446;,
+ 0.369642;-0.923880;-0.099045;,
+ 0.379408;-0.923880;-0.049950;,
+ 0.442287;-0.896874;0.000000;,
+ 0.438503;-0.896874;0.057730;,
+ 0.427216;-0.896874;0.114472;,
+ 0.408620;-0.896874;0.169256;,
+ 0.383032;-0.896874;0.221143;,
+ 0.350890;-0.896874;0.269247;,
+ 0.312744;-0.896874;0.312744;,
+ 0.269247;-0.896874;0.350890;,
+ 0.221143;-0.896874;0.383032;,
+ 0.169256;-0.896874;0.408620;,
+ 0.114472;-0.896874;0.427216;,
+ 0.057730;-0.896874;0.438503;,
+ 0.000000;-0.896874;0.442287;,
+ 0.000000;-0.896874;0.442287;,
+ -0.057730;-0.896874;0.438503;,
+ -0.114472;-0.896874;0.427216;,
+ -0.169256;-0.896874;0.408620;,
+ -0.221143;-0.896874;0.383032;,
+ -0.269247;-0.896874;0.350890;,
+ -0.312744;-0.896874;0.312744;,
+ -0.350890;-0.896874;0.269247;,
+ -0.383032;-0.896874;0.221143;,
+ -0.408620;-0.896874;0.169256;,
+ -0.427216;-0.896874;0.114472;,
+ -0.438503;-0.896874;0.057730;,
+ -0.442287;-0.896874;0.000000;,
+ -0.438503;-0.896874;-0.057730;,
+ -0.427216;-0.896874;-0.114472;,
+ -0.408620;-0.896874;-0.169256;,
+ -0.383032;-0.896874;-0.221143;,
+ -0.350890;-0.896874;-0.269247;,
+ -0.312744;-0.896874;-0.312744;,
+ -0.269247;-0.896874;-0.350890;,
+ -0.221143;-0.896874;-0.383032;,
+ -0.169256;-0.896874;-0.408620;,
+ -0.114472;-0.896874;-0.427216;,
+ -0.057730;-0.896874;-0.438503;,
+ 0.000000;-0.896874;-0.442287;,
+ 0.057730;-0.896874;-0.438503;,
+ 0.114472;-0.896874;-0.427216;,
+ 0.169256;-0.896874;-0.408620;,
+ 0.221143;-0.896874;-0.383032;,
+ 0.269247;-0.896874;-0.350890;,
+ 0.312744;-0.896874;-0.312744;,
+ 0.350890;-0.896874;-0.269247;,
+ 0.383032;-0.896874;-0.221143;,
+ 0.408620;-0.896874;-0.169256;,
+ 0.427216;-0.896874;-0.114472;,
+ 0.438503;-0.896874;-0.057730;,
+ 0.499998;-0.866026;-0.000000;,
+ 0.495721;-0.866026;0.065263;,
+ 0.482961;-0.866026;0.129409;,
+ 0.461938;-0.866026;0.191341;,
+ 0.433011;-0.866026;0.249999;,
+ 0.396675;-0.866026;0.304380;,
+ 0.353552;-0.866026;0.353552;,
+ 0.304380;-0.866026;0.396675;,
+ 0.249999;-0.866026;0.433011;,
+ 0.191341;-0.866026;0.461938;,
+ 0.129409;-0.866026;0.482961;,
+ 0.065263;-0.866026;0.495721;,
+ 0.000000;-0.866026;0.499998;,
+ 0.000000;-0.866026;0.499998;,
+ -0.065263;-0.866026;0.495721;,
+ -0.129409;-0.866026;0.482961;,
+ -0.191341;-0.866026;0.461938;,
+ -0.249999;-0.866026;0.433011;,
+ -0.304380;-0.866026;0.396675;,
+ -0.353552;-0.866026;0.353552;,
+ -0.396675;-0.866026;0.304380;,
+ -0.433011;-0.866026;0.249999;,
+ -0.461938;-0.866026;0.191341;,
+ -0.482961;-0.866026;0.129409;,
+ -0.495721;-0.866026;0.065263;,
+ -0.499998;-0.866026;-0.000000;,
+ -0.495721;-0.866026;-0.065263;,
+ -0.482961;-0.866026;-0.129409;,
+ -0.461938;-0.866026;-0.191341;,
+ -0.433011;-0.866026;-0.249999;,
+ -0.396675;-0.866026;-0.304380;,
+ -0.353552;-0.866026;-0.353552;,
+ -0.304380;-0.866026;-0.396675;,
+ -0.249999;-0.866026;-0.433011;,
+ -0.191341;-0.866026;-0.461938;,
+ -0.129409;-0.866026;-0.482961;,
+ -0.065263;-0.866026;-0.495721;,
+ 0.000000;-0.866026;-0.499998;,
+ 0.065263;-0.866026;-0.495721;,
+ 0.129409;-0.866026;-0.482961;,
+ 0.191341;-0.866026;-0.461938;,
+ 0.249999;-0.866026;-0.433011;,
+ 0.304380;-0.866026;-0.396675;,
+ 0.353552;-0.866026;-0.353552;,
+ 0.396675;-0.866026;-0.304380;,
+ 0.433011;-0.866026;-0.249999;,
+ 0.461938;-0.866026;-0.191341;,
+ 0.482961;-0.866026;-0.129409;,
+ 0.495721;-0.866026;-0.065263;,
+ 0.555568;-0.831471;0.000000;,
+ 0.550816;-0.831471;0.072516;,
+ 0.536638;-0.831471;0.143792;,
+ 0.513278;-0.831471;0.212607;,
+ 0.481136;-0.831471;0.277784;,
+ 0.440762;-0.831471;0.338209;,
+ 0.392846;-0.831471;0.392846;,
+ 0.338209;-0.831471;0.440762;,
+ 0.277784;-0.831471;0.481136;,
+ 0.212607;-0.831471;0.513278;,
+ 0.143792;-0.831471;0.536638;,
+ 0.072516;-0.831471;0.550816;,
+ 0.000000;-0.831471;0.555568;,
+ 0.000000;-0.831471;0.555568;,
+ -0.072516;-0.831471;0.550816;,
+ -0.143792;-0.831471;0.536638;,
+ -0.212607;-0.831471;0.513278;,
+ -0.277784;-0.831471;0.481136;,
+ -0.338209;-0.831471;0.440762;,
+ -0.392846;-0.831471;0.392846;,
+ -0.440762;-0.831471;0.338209;,
+ -0.481136;-0.831471;0.277784;,
+ -0.513278;-0.831471;0.212607;,
+ -0.536638;-0.831471;0.143792;,
+ -0.550816;-0.831471;0.072516;,
+ -0.555568;-0.831471;0.000000;,
+ -0.550816;-0.831471;-0.072516;,
+ -0.536638;-0.831471;-0.143792;,
+ -0.513278;-0.831471;-0.212607;,
+ -0.481136;-0.831471;-0.277784;,
+ -0.440762;-0.831471;-0.338209;,
+ -0.392846;-0.831471;-0.392846;,
+ -0.338209;-0.831471;-0.440762;,
+ -0.277784;-0.831471;-0.481136;,
+ -0.212607;-0.831471;-0.513278;,
+ -0.143792;-0.831471;-0.536638;,
+ -0.072516;-0.831471;-0.550816;,
+ 0.000000;-0.831471;-0.555569;,
+ 0.072516;-0.831471;-0.550816;,
+ 0.143792;-0.831471;-0.536638;,
+ 0.212607;-0.831471;-0.513278;,
+ 0.277784;-0.831471;-0.481136;,
+ 0.338209;-0.831471;-0.440762;,
+ 0.392846;-0.831471;-0.392846;,
+ 0.440762;-0.831471;-0.338209;,
+ 0.481136;-0.831471;-0.277784;,
+ 0.513278;-0.831471;-0.212607;,
+ 0.536638;-0.831471;-0.143792;,
+ 0.550816;-0.831471;-0.072516;,
+ 0.608760;-0.793355;0.000000;,
+ 0.603552;-0.793355;0.079459;,
+ 0.588017;-0.793355;0.157559;,
+ 0.562420;-0.793355;0.232962;,
+ 0.527201;-0.793355;0.304380;,
+ 0.482961;-0.793355;0.370589;,
+ 0.430458;-0.793355;0.430458;,
+ 0.370589;-0.793355;0.482961;,
+ 0.304380;-0.793355;0.527201;,
+ 0.232962;-0.793355;0.562420;,
+ 0.157559;-0.793355;0.588017;,
+ 0.079459;-0.793355;0.603552;,
+ 0.000000;-0.793355;0.608760;,
+ 0.000000;-0.793355;0.608760;,
+ -0.079459;-0.793355;0.603552;,
+ -0.157559;-0.793355;0.588017;,
+ -0.232962;-0.793355;0.562420;,
+ -0.304380;-0.793355;0.527201;,
+ -0.370589;-0.793355;0.482961;,
+ -0.430458;-0.793355;0.430458;,
+ -0.482961;-0.793355;0.370589;,
+ -0.527201;-0.793355;0.304380;,
+ -0.562420;-0.793355;0.232962;,
+ -0.588017;-0.793355;0.157559;,
+ -0.603552;-0.793355;0.079459;,
+ -0.608760;-0.793355;0.000000;,
+ -0.603552;-0.793355;-0.079459;,
+ -0.588017;-0.793355;-0.157559;,
+ -0.562420;-0.793355;-0.232962;,
+ -0.527201;-0.793355;-0.304380;,
+ -0.482961;-0.793355;-0.370589;,
+ -0.430458;-0.793355;-0.430458;,
+ -0.370589;-0.793355;-0.482961;,
+ -0.304380;-0.793355;-0.527201;,
+ -0.232962;-0.793355;-0.562420;,
+ -0.157559;-0.793355;-0.588017;,
+ -0.079459;-0.793355;-0.603552;,
+ 0.000000;-0.793355;-0.608760;,
+ 0.079459;-0.793355;-0.603552;,
+ 0.157559;-0.793355;-0.588017;,
+ 0.232962;-0.793355;-0.562420;,
+ 0.304380;-0.793355;-0.527201;,
+ 0.370589;-0.793355;-0.482961;,
+ 0.430458;-0.793355;-0.430458;,
+ 0.482961;-0.793355;-0.370589;,
+ 0.527201;-0.793355;-0.304380;,
+ 0.562420;-0.793355;-0.232962;,
+ 0.588017;-0.793355;-0.157559;,
+ 0.603552;-0.793355;-0.079459;,
+ 0.659344;-0.751841;-0.000000;,
+ 0.653703;-0.751841;0.086062;,
+ 0.636877;-0.751841;0.170651;,
+ 0.609154;-0.751841;0.252320;,
+ 0.571009;-0.751841;0.329672;,
+ 0.523093;-0.751841;0.401383;,
+ 0.466227;-0.751841;0.466227;,
+ 0.401383;-0.751841;0.523093;,
+ 0.329672;-0.751841;0.571009;,
+ 0.252320;-0.751841;0.609154;,
+ 0.170651;-0.751841;0.636877;,
+ 0.086062;-0.751841;0.653703;,
+ 0.000000;-0.751841;0.659344;,
+ 0.000000;-0.751841;0.659344;,
+ -0.086062;-0.751841;0.653703;,
+ -0.170651;-0.751841;0.636877;,
+ -0.252320;-0.751841;0.609154;,
+ -0.329672;-0.751841;0.571009;,
+ -0.401383;-0.751841;0.523093;,
+ -0.466227;-0.751841;0.466227;,
+ -0.523093;-0.751841;0.401383;,
+ -0.571009;-0.751841;0.329672;,
+ -0.609154;-0.751841;0.252320;,
+ -0.636877;-0.751841;0.170651;,
+ -0.653703;-0.751841;0.086062;,
+ -0.659344;-0.751841;-0.000000;,
+ -0.653703;-0.751841;-0.086062;,
+ -0.636877;-0.751841;-0.170651;,
+ -0.609154;-0.751841;-0.252320;,
+ -0.571009;-0.751841;-0.329672;,
+ -0.523093;-0.751841;-0.401383;,
+ -0.466227;-0.751841;-0.466227;,
+ -0.401383;-0.751841;-0.523093;,
+ -0.329672;-0.751841;-0.571009;,
+ -0.252320;-0.751841;-0.609154;,
+ -0.170651;-0.751841;-0.636877;,
+ -0.086062;-0.751841;-0.653703;,
+ 0.000000;-0.751841;-0.659344;,
+ 0.086062;-0.751841;-0.653703;,
+ 0.170651;-0.751841;-0.636877;,
+ 0.252320;-0.751841;-0.609154;,
+ 0.329672;-0.751841;-0.571009;,
+ 0.401383;-0.751841;-0.523093;,
+ 0.466227;-0.751841;-0.466227;,
+ 0.523093;-0.751841;-0.401383;,
+ 0.571009;-0.751841;-0.329672;,
+ 0.609154;-0.751841;-0.252320;,
+ 0.636877;-0.751841;-0.170651;,
+ 0.653703;-0.751841;-0.086062;,
+ 0.707105;-0.707108;-0.000000;,
+ 0.701056;-0.707108;0.092296;,
+ 0.683011;-0.707108;0.183012;,
+ 0.653280;-0.707108;0.270597;,
+ 0.612371;-0.707108;0.353553;,
+ 0.560984;-0.707108;0.430458;,
+ 0.499999;-0.707108;0.499999;,
+ 0.430458;-0.707108;0.560984;,
+ 0.353553;-0.707108;0.612371;,
+ 0.270597;-0.707108;0.653280;,
+ 0.183012;-0.707108;0.683011;,
+ 0.092296;-0.707108;0.701056;,
+ 0.000000;-0.707108;0.707105;,
+ 0.000000;-0.707108;0.707105;,
+ -0.092296;-0.707108;0.701056;,
+ -0.183012;-0.707108;0.683011;,
+ -0.270597;-0.707108;0.653280;,
+ -0.353553;-0.707108;0.612371;,
+ -0.430458;-0.707108;0.560984;,
+ -0.499999;-0.707108;0.499999;,
+ -0.560984;-0.707108;0.430458;,
+ -0.612371;-0.707108;0.353553;,
+ -0.653280;-0.707108;0.270597;,
+ -0.683011;-0.707108;0.183012;,
+ -0.701056;-0.707108;0.092296;,
+ -0.707105;-0.707108;-0.000000;,
+ -0.701056;-0.707108;-0.092296;,
+ -0.683011;-0.707108;-0.183012;,
+ -0.653280;-0.707108;-0.270597;,
+ -0.612371;-0.707108;-0.353553;,
+ -0.560984;-0.707108;-0.430458;,
+ -0.499999;-0.707108;-0.499999;,
+ -0.430458;-0.707108;-0.560984;,
+ -0.353553;-0.707108;-0.612371;,
+ -0.270597;-0.707108;-0.653280;,
+ -0.183012;-0.707108;-0.683011;,
+ -0.092296;-0.707108;-0.701056;,
+ 0.000000;-0.707108;-0.707105;,
+ 0.092296;-0.707108;-0.701056;,
+ 0.183012;-0.707108;-0.683011;,
+ 0.270597;-0.707108;-0.653280;,
+ 0.353553;-0.707108;-0.612371;,
+ 0.430458;-0.707108;-0.560984;,
+ 0.499999;-0.707108;-0.499999;,
+ 0.560984;-0.707108;-0.430458;,
+ 0.612371;-0.707108;-0.353553;,
+ 0.653280;-0.707108;-0.270597;,
+ 0.683011;-0.707108;-0.183012;,
+ 0.701056;-0.707108;-0.092296;,
+ 0.751838;-0.659348;0.000000;,
+ 0.745406;-0.659348;0.098135;,
+ 0.726220;-0.659347;0.194590;,
+ 0.694608;-0.659347;0.287716;,
+ 0.651111;-0.659347;0.375919;,
+ 0.596473;-0.659348;0.457690;,
+ 0.531630;-0.659348;0.531630;,
+ 0.457690;-0.659348;0.596473;,
+ 0.375919;-0.659348;0.651111;,
+ 0.287716;-0.659347;0.694608;,
+ 0.194590;-0.659347;0.726220;,
+ 0.098135;-0.659347;0.745406;,
+ 0.000000;-0.659348;0.751838;,
+ 0.000000;-0.659348;0.751838;,
+ -0.098135;-0.659347;0.745406;,
+ -0.194590;-0.659347;0.726220;,
+ -0.287716;-0.659347;0.694608;,
+ -0.375919;-0.659348;0.651111;,
+ -0.457690;-0.659348;0.596473;,
+ -0.531630;-0.659348;0.531630;,
+ -0.596473;-0.659348;0.457690;,
+ -0.651111;-0.659347;0.375919;,
+ -0.694608;-0.659347;0.287716;,
+ -0.726220;-0.659347;0.194590;,
+ -0.745406;-0.659348;0.098135;,
+ -0.751838;-0.659348;0.000000;,
+ -0.745406;-0.659347;-0.098135;,
+ -0.726220;-0.659347;-0.194590;,
+ -0.694608;-0.659347;-0.287716;,
+ -0.651111;-0.659348;-0.375919;,
+ -0.596473;-0.659348;-0.457690;,
+ -0.531630;-0.659348;-0.531630;,
+ -0.457690;-0.659348;-0.596473;,
+ -0.375919;-0.659347;-0.651111;,
+ -0.287716;-0.659347;-0.694608;,
+ -0.194590;-0.659347;-0.726220;,
+ -0.098135;-0.659348;-0.745406;,
+ 0.000000;-0.659348;-0.751838;,
+ 0.098135;-0.659348;-0.745406;,
+ 0.194590;-0.659347;-0.726220;,
+ 0.287716;-0.659347;-0.694608;,
+ 0.375919;-0.659347;-0.651111;,
+ 0.457690;-0.659348;-0.596473;,
+ 0.531630;-0.659348;-0.531630;,
+ 0.596473;-0.659348;-0.457690;,
+ 0.651111;-0.659348;-0.375919;,
+ 0.694608;-0.659347;-0.287716;,
+ 0.726220;-0.659347;-0.194590;,
+ 0.745406;-0.659347;-0.098135;,
+ 0.793352;-0.608763;0.000000;,
+ 0.786565;-0.608763;0.103553;,
+ 0.766319;-0.608763;0.205335;,
+ 0.732962;-0.608763;0.303603;,
+ 0.687063;-0.608763;0.396676;,
+ 0.629408;-0.608763;0.482962;,
+ 0.560985;-0.608763;0.560985;,
+ 0.482962;-0.608763;0.629409;,
+ 0.396676;-0.608763;0.687063;,
+ 0.303603;-0.608763;0.732962;,
+ 0.205335;-0.608763;0.766319;,
+ 0.103553;-0.608763;0.786565;,
+ 0.000000;-0.608763;0.793352;,
+ 0.000000;-0.608763;0.793352;,
+ -0.103553;-0.608763;0.786565;,
+ -0.205335;-0.608763;0.766319;,
+ -0.303603;-0.608763;0.732962;,
+ -0.396676;-0.608763;0.687063;,
+ -0.482962;-0.608763;0.629409;,
+ -0.560985;-0.608763;0.560985;,
+ -0.629408;-0.608763;0.482962;,
+ -0.687063;-0.608763;0.396676;,
+ -0.732962;-0.608763;0.303603;,
+ -0.766319;-0.608763;0.205335;,
+ -0.786565;-0.608763;0.103553;,
+ -0.793352;-0.608763;0.000000;,
+ -0.786565;-0.608763;-0.103553;,
+ -0.766319;-0.608763;-0.205335;,
+ -0.732962;-0.608763;-0.303603;,
+ -0.687063;-0.608763;-0.396676;,
+ -0.629409;-0.608763;-0.482962;,
+ -0.560985;-0.608763;-0.560985;,
+ -0.482962;-0.608763;-0.629408;,
+ -0.396676;-0.608763;-0.687063;,
+ -0.303603;-0.608763;-0.732962;,
+ -0.205335;-0.608763;-0.766319;,
+ -0.103553;-0.608763;-0.786565;,
+ 0.000000;-0.608763;-0.793352;,
+ 0.103553;-0.608763;-0.786565;,
+ 0.205335;-0.608763;-0.766319;,
+ 0.303603;-0.608763;-0.732962;,
+ 0.396676;-0.608763;-0.687063;,
+ 0.482962;-0.608763;-0.629408;,
+ 0.560985;-0.608763;-0.560985;,
+ 0.629409;-0.608763;-0.482962;,
+ 0.687063;-0.608763;-0.396676;,
+ 0.732962;-0.608763;-0.303603;,
+ 0.766319;-0.608763;-0.205335;,
+ 0.786565;-0.608763;-0.103553;,
+ 0.831468;-0.555572;-0.000000;,
+ 0.824355;-0.555572;0.108528;,
+ 0.803137;-0.555572;0.215200;,
+ 0.768177;-0.555572;0.318189;,
+ 0.720073;-0.555572;0.415734;,
+ 0.659648;-0.555572;0.506166;,
+ 0.587937;-0.555572;0.587937;,
+ 0.506166;-0.555572;0.659648;,
+ 0.415734;-0.555572;0.720073;,
+ 0.318189;-0.555572;0.768177;,
+ 0.215200;-0.555572;0.803137;,
+ 0.108528;-0.555572;0.824355;,
+ 0.000000;-0.555572;0.831468;,
+ 0.000000;-0.555572;0.831468;,
+ -0.108528;-0.555572;0.824355;,
+ -0.215200;-0.555572;0.803137;,
+ -0.318189;-0.555572;0.768177;,
+ -0.415734;-0.555572;0.720073;,
+ -0.506166;-0.555572;0.659648;,
+ -0.587937;-0.555572;0.587937;,
+ -0.659648;-0.555572;0.506166;,
+ -0.720073;-0.555572;0.415734;,
+ -0.768177;-0.555572;0.318189;,
+ -0.803137;-0.555572;0.215200;,
+ -0.824355;-0.555572;0.108528;,
+ -0.831468;-0.555572;-0.000000;,
+ -0.824355;-0.555572;-0.108528;,
+ -0.803137;-0.555572;-0.215200;,
+ -0.768177;-0.555572;-0.318189;,
+ -0.720073;-0.555572;-0.415734;,
+ -0.659648;-0.555572;-0.506166;,
+ -0.587937;-0.555572;-0.587937;,
+ -0.506166;-0.555572;-0.659648;,
+ -0.415734;-0.555572;-0.720073;,
+ -0.318189;-0.555572;-0.768177;,
+ -0.215200;-0.555572;-0.803137;,
+ -0.108528;-0.555572;-0.824355;,
+ 0.000000;-0.555572;-0.831468;,
+ 0.108528;-0.555572;-0.824355;,
+ 0.215200;-0.555572;-0.803137;,
+ 0.318189;-0.555572;-0.768177;,
+ 0.415734;-0.555572;-0.720073;,
+ 0.506166;-0.555572;-0.659648;,
+ 0.587937;-0.555572;-0.587937;,
+ 0.659648;-0.555572;-0.506166;,
+ 0.720073;-0.555572;-0.415734;,
+ 0.768177;-0.555572;-0.318189;,
+ 0.803137;-0.555572;-0.215200;,
+ 0.824355;-0.555572;-0.108528;,
+ 0.866024;-0.500002;-0.000000;,
+ 0.858615;-0.500002;0.113039;,
+ 0.836515;-0.500002;0.224144;,
+ 0.800102;-0.500002;0.331413;,
+ 0.749999;-0.500002;0.433012;,
+ 0.687063;-0.500002;0.527202;,
+ 0.612372;-0.500002;0.612372;,
+ 0.527202;-0.500002;0.687063;,
+ 0.433012;-0.500002;0.749999;,
+ 0.331413;-0.500002;0.800102;,
+ 0.224144;-0.500002;0.836515;,
+ 0.113039;-0.500002;0.858615;,
+ 0.000000;-0.500002;0.866024;,
+ 0.000000;-0.500002;0.866024;,
+ -0.113039;-0.500002;0.858615;,
+ -0.224144;-0.500002;0.836515;,
+ -0.331413;-0.500002;0.800102;,
+ -0.433012;-0.500002;0.749999;,
+ -0.527202;-0.500002;0.687063;,
+ -0.612372;-0.500002;0.612372;,
+ -0.687063;-0.500002;0.527202;,
+ -0.749999;-0.500002;0.433012;,
+ -0.800102;-0.500002;0.331413;,
+ -0.836515;-0.500002;0.224144;,
+ -0.858615;-0.500002;0.113039;,
+ -0.866024;-0.500002;-0.000000;,
+ -0.858615;-0.500002;-0.113039;,
+ -0.836515;-0.500002;-0.224144;,
+ -0.800102;-0.500002;-0.331413;,
+ -0.749999;-0.500002;-0.433012;,
+ -0.687063;-0.500002;-0.527202;,
+ -0.612372;-0.500002;-0.612372;,
+ -0.527202;-0.500002;-0.687063;,
+ -0.433012;-0.500002;-0.749999;,
+ -0.331413;-0.500002;-0.800102;,
+ -0.224144;-0.500002;-0.836515;,
+ -0.113039;-0.500002;-0.858615;,
+ 0.000000;-0.500002;-0.866024;,
+ 0.113039;-0.500002;-0.858615;,
+ 0.224144;-0.500002;-0.836515;,
+ 0.331413;-0.500002;-0.800102;,
+ 0.433012;-0.500002;-0.749999;,
+ 0.527202;-0.500002;-0.687063;,
+ 0.612372;-0.500002;-0.612372;,
+ 0.687063;-0.500002;-0.527202;,
+ 0.749999;-0.500002;-0.433012;,
+ 0.800102;-0.500002;-0.331413;,
+ 0.836515;-0.500002;-0.224144;,
+ 0.858615;-0.500002;-0.113039;,
+ 0.896872;-0.442290;0.000000;,
+ 0.889199;-0.442290;0.117065;,
+ 0.866312;-0.442290;0.232128;,
+ 0.828602;-0.442290;0.343218;,
+ 0.776714;-0.442290;0.448436;,
+ 0.711536;-0.442290;0.545981;,
+ 0.634184;-0.442290;0.634184;,
+ 0.545981;-0.442290;0.711536;,
+ 0.448436;-0.442290;0.776714;,
+ 0.343218;-0.442290;0.828602;,
+ 0.232127;-0.442290;0.866312;,
+ 0.117065;-0.442290;0.889199;,
+ 0.000000;-0.442291;0.896872;,
+ 0.000000;-0.442291;0.896872;,
+ -0.117065;-0.442290;0.889199;,
+ -0.232127;-0.442290;0.866312;,
+ -0.343218;-0.442290;0.828602;,
+ -0.448436;-0.442290;0.776714;,
+ -0.545981;-0.442290;0.711536;,
+ -0.634184;-0.442290;0.634184;,
+ -0.711536;-0.442290;0.545981;,
+ -0.776714;-0.442290;0.448436;,
+ -0.828602;-0.442290;0.343218;,
+ -0.866312;-0.442290;0.232128;,
+ -0.889199;-0.442290;0.117065;,
+ -0.896872;-0.442290;0.000000;,
+ -0.889199;-0.442290;-0.117065;,
+ -0.866312;-0.442290;-0.232127;,
+ -0.828602;-0.442290;-0.343218;,
+ -0.776714;-0.442290;-0.448436;,
+ -0.711536;-0.442290;-0.545981;,
+ -0.634184;-0.442290;-0.634184;,
+ -0.545981;-0.442290;-0.711536;,
+ -0.448436;-0.442290;-0.776714;,
+ -0.343218;-0.442290;-0.828602;,
+ -0.232128;-0.442290;-0.866312;,
+ -0.117065;-0.442290;-0.889199;,
+ 0.000000;-0.442290;-0.896872;,
+ 0.117065;-0.442290;-0.889199;,
+ 0.232128;-0.442290;-0.866312;,
+ 0.343218;-0.442290;-0.828602;,
+ 0.448436;-0.442290;-0.776714;,
+ 0.545981;-0.442290;-0.711536;,
+ 0.634184;-0.442290;-0.634184;,
+ 0.711536;-0.442290;-0.545981;,
+ 0.776714;-0.442290;-0.448436;,
+ 0.828602;-0.442290;-0.343218;,
+ 0.866312;-0.442290;-0.232127;,
+ 0.889199;-0.442290;-0.117065;,
+ 0.923879;-0.382685;0.000000;,
+ 0.915975;-0.382685;0.120590;,
+ 0.892399;-0.382685;0.239117;,
+ 0.853553;-0.382685;0.353553;,
+ 0.800103;-0.382685;0.461939;,
+ 0.732962;-0.382685;0.562422;,
+ 0.653281;-0.382685;0.653281;,
+ 0.562422;-0.382685;0.732962;,
+ 0.461939;-0.382685;0.800103;,
+ 0.353553;-0.382685;0.853553;,
+ 0.239117;-0.382685;0.892399;,
+ 0.120590;-0.382685;0.915975;,
+ 0.000000;-0.382685;0.923879;,
+ 0.000000;-0.382685;0.923879;,
+ -0.120590;-0.382685;0.915975;,
+ -0.239117;-0.382685;0.892399;,
+ -0.353553;-0.382685;0.853553;,
+ -0.461939;-0.382685;0.800103;,
+ -0.562422;-0.382685;0.732962;,
+ -0.653281;-0.382685;0.653281;,
+ -0.732962;-0.382685;0.562422;,
+ -0.800103;-0.382685;0.461939;,
+ -0.853553;-0.382685;0.353553;,
+ -0.892399;-0.382685;0.239117;,
+ -0.915975;-0.382685;0.120590;,
+ -0.923879;-0.382685;0.000000;,
+ -0.915975;-0.382685;-0.120590;,
+ -0.892399;-0.382685;-0.239117;,
+ -0.853553;-0.382685;-0.353553;,
+ -0.800103;-0.382685;-0.461939;,
+ -0.732962;-0.382685;-0.562422;,
+ -0.653281;-0.382685;-0.653281;,
+ -0.562422;-0.382685;-0.732962;,
+ -0.461939;-0.382685;-0.800103;,
+ -0.353553;-0.382685;-0.853553;,
+ -0.239117;-0.382685;-0.892399;,
+ -0.120590;-0.382685;-0.915975;,
+ 0.000000;-0.382685;-0.923879;,
+ 0.120590;-0.382685;-0.915975;,
+ 0.239117;-0.382685;-0.892399;,
+ 0.353553;-0.382685;-0.853553;,
+ 0.461939;-0.382685;-0.800103;,
+ 0.562422;-0.382685;-0.732962;,
+ 0.653281;-0.382685;-0.653281;,
+ 0.732962;-0.382685;-0.562422;,
+ 0.800103;-0.382685;-0.461939;,
+ 0.853553;-0.382685;-0.353553;,
+ 0.892399;-0.382685;-0.239117;,
+ 0.915975;-0.382685;-0.120590;,
+ 0.946930;-0.321441;-0.000000;,
+ 0.938829;-0.321441;0.123599;,
+ 0.914664;-0.321441;0.245083;,
+ 0.874849;-0.321441;0.362374;,
+ 0.820065;-0.321441;0.473465;,
+ 0.751250;-0.321441;0.576454;,
+ 0.669580;-0.321441;0.669580;,
+ 0.576454;-0.321441;0.751250;,
+ 0.473465;-0.321441;0.820065;,
+ 0.362374;-0.321441;0.874849;,
+ 0.245083;-0.321441;0.914664;,
+ 0.123599;-0.321441;0.938828;,
+ 0.000000;-0.321441;0.946930;,
+ 0.000000;-0.321441;0.946930;,
+ -0.123599;-0.321441;0.938828;,
+ -0.245083;-0.321441;0.914664;,
+ -0.362374;-0.321441;0.874849;,
+ -0.473465;-0.321441;0.820065;,
+ -0.576454;-0.321441;0.751250;,
+ -0.669580;-0.321441;0.669580;,
+ -0.751250;-0.321441;0.576454;,
+ -0.820065;-0.321441;0.473465;,
+ -0.874849;-0.321441;0.362374;,
+ -0.914664;-0.321441;0.245083;,
+ -0.938829;-0.321441;0.123599;,
+ -0.946930;-0.321441;-0.000000;,
+ -0.938828;-0.321441;-0.123599;,
+ -0.914664;-0.321441;-0.245083;,
+ -0.874849;-0.321441;-0.362374;,
+ -0.820065;-0.321441;-0.473465;,
+ -0.751250;-0.321441;-0.576454;,
+ -0.669580;-0.321441;-0.669580;,
+ -0.576454;-0.321441;-0.751250;,
+ -0.473465;-0.321441;-0.820065;,
+ -0.362374;-0.321441;-0.874849;,
+ -0.245083;-0.321441;-0.914664;,
+ -0.123599;-0.321441;-0.938829;,
+ 0.000000;-0.321441;-0.946930;,
+ 0.123599;-0.321441;-0.938829;,
+ 0.245083;-0.321441;-0.914664;,
+ 0.362374;-0.321441;-0.874849;,
+ 0.473465;-0.321441;-0.820065;,
+ 0.576454;-0.321441;-0.751250;,
+ 0.669580;-0.321441;-0.669580;,
+ 0.751250;-0.321441;-0.576454;,
+ 0.820065;-0.321441;-0.473465;,
+ 0.874849;-0.321441;-0.362374;,
+ 0.914664;-0.321441;-0.245083;,
+ 0.938828;-0.321441;-0.123599;,
+ 0.965926;-0.258820;0.000000;,
+ 0.957662;-0.258820;0.126078;,
+ 0.933012;-0.258820;0.250000;,
+ 0.892399;-0.258820;0.369644;,
+ 0.836516;-0.258820;0.482963;,
+ 0.766320;-0.258820;0.588018;,
+ 0.683012;-0.258820;0.683012;,
+ 0.588018;-0.258820;0.766320;,
+ 0.482963;-0.258820;0.836516;,
+ 0.369644;-0.258820;0.892399;,
+ 0.250000;-0.258820;0.933012;,
+ 0.126078;-0.258820;0.957662;,
+ 0.000000;-0.258820;0.965926;,
+ 0.000000;-0.258820;0.965926;,
+ -0.126078;-0.258820;0.957662;,
+ -0.250000;-0.258820;0.933012;,
+ -0.369644;-0.258820;0.892399;,
+ -0.482963;-0.258820;0.836516;,
+ -0.588018;-0.258820;0.766320;,
+ -0.683012;-0.258820;0.683012;,
+ -0.766320;-0.258820;0.588018;,
+ -0.836516;-0.258820;0.482963;,
+ -0.892399;-0.258820;0.369644;,
+ -0.933012;-0.258820;0.250000;,
+ -0.957662;-0.258820;0.126078;,
+ -0.965926;-0.258820;0.000000;,
+ -0.957662;-0.258820;-0.126078;,
+ -0.933012;-0.258820;-0.250000;,
+ -0.892399;-0.258820;-0.369644;,
+ -0.836516;-0.258820;-0.482963;,
+ -0.766320;-0.258820;-0.588018;,
+ -0.683012;-0.258820;-0.683012;,
+ -0.588018;-0.258820;-0.766320;,
+ -0.482963;-0.258820;-0.836516;,
+ -0.369644;-0.258820;-0.892399;,
+ -0.250000;-0.258820;-0.933012;,
+ -0.126078;-0.258820;-0.957662;,
+ 0.000000;-0.258820;-0.965926;,
+ 0.126078;-0.258820;-0.957662;,
+ 0.250000;-0.258820;-0.933012;,
+ 0.369644;-0.258820;-0.892399;,
+ 0.482963;-0.258820;-0.836516;,
+ 0.588018;-0.258820;-0.766320;,
+ 0.683012;-0.258820;-0.683012;,
+ 0.766320;-0.258820;-0.588018;,
+ 0.836516;-0.258820;-0.482963;,
+ 0.892399;-0.258820;-0.369644;,
+ 0.933012;-0.258820;-0.250000;,
+ 0.957662;-0.258820;-0.126078;,
+ 0.980785;-0.195091;-0.000000;,
+ 0.972394;-0.195091;0.128018;,
+ 0.947366;-0.195091;0.253846;,
+ 0.906127;-0.195091;0.375330;,
+ 0.849385;-0.195091;0.490393;,
+ 0.778109;-0.195091;0.597064;,
+ 0.693520;-0.195091;0.693520;,
+ 0.597064;-0.195091;0.778109;,
+ 0.490393;-0.195091;0.849385;,
+ 0.375330;-0.195091;0.906127;,
+ 0.253846;-0.195091;0.947366;,
+ 0.128018;-0.195091;0.972394;,
+ 0.000000;-0.195091;0.980785;,
+ 0.000000;-0.195091;0.980785;,
+ -0.128018;-0.195091;0.972394;,
+ -0.253846;-0.195091;0.947366;,
+ -0.375330;-0.195091;0.906127;,
+ -0.490393;-0.195091;0.849385;,
+ -0.597064;-0.195091;0.778109;,
+ -0.693520;-0.195091;0.693520;,
+ -0.778109;-0.195091;0.597064;,
+ -0.849385;-0.195091;0.490393;,
+ -0.906127;-0.195091;0.375330;,
+ -0.947366;-0.195091;0.253846;,
+ -0.972394;-0.195091;0.128018;,
+ -0.980785;-0.195091;-0.000000;,
+ -0.972394;-0.195091;-0.128018;,
+ -0.947366;-0.195091;-0.253846;,
+ -0.906127;-0.195091;-0.375330;,
+ -0.849385;-0.195091;-0.490393;,
+ -0.778109;-0.195091;-0.597064;,
+ -0.693520;-0.195091;-0.693520;,
+ -0.597064;-0.195091;-0.778109;,
+ -0.490393;-0.195091;-0.849385;,
+ -0.375330;-0.195091;-0.906127;,
+ -0.253846;-0.195091;-0.947366;,
+ -0.128018;-0.195091;-0.972394;,
+ 0.000000;-0.195091;-0.980785;,
+ 0.128018;-0.195091;-0.972394;,
+ 0.253846;-0.195091;-0.947366;,
+ 0.375330;-0.195091;-0.906127;,
+ 0.490393;-0.195091;-0.849385;,
+ 0.597064;-0.195091;-0.778109;,
+ 0.693520;-0.195091;-0.693520;,
+ 0.778109;-0.195091;-0.597064;,
+ 0.849385;-0.195091;-0.490393;,
+ 0.906127;-0.195091;-0.375330;,
+ 0.947366;-0.195091;-0.253846;,
+ 0.972394;-0.195091;-0.128018;,
+ 0.991445;-0.130527;-0.000000;,
+ 0.982963;-0.130527;0.129409;,
+ 0.957662;-0.130527;0.256605;,
+ 0.915976;-0.130527;0.379410;,
+ 0.858616;-0.130527;0.495722;,
+ 0.786566;-0.130527;0.603553;,
+ 0.701057;-0.130527;0.701057;,
+ 0.603553;-0.130527;0.786566;,
+ 0.495722;-0.130527;0.858616;,
+ 0.379410;-0.130527;0.915976;,
+ 0.256605;-0.130527;0.957662;,
+ 0.129409;-0.130527;0.982963;,
+ 0.000000;-0.130527;0.991445;,
+ 0.000000;-0.130527;0.991445;,
+ -0.129409;-0.130527;0.982963;,
+ -0.256605;-0.130527;0.957662;,
+ -0.379410;-0.130527;0.915976;,
+ -0.495722;-0.130527;0.858616;,
+ -0.603553;-0.130527;0.786566;,
+ -0.701057;-0.130527;0.701057;,
+ -0.786566;-0.130527;0.603553;,
+ -0.858616;-0.130527;0.495722;,
+ -0.915976;-0.130527;0.379410;,
+ -0.957662;-0.130527;0.256605;,
+ -0.982963;-0.130527;0.129409;,
+ -0.991445;-0.130527;-0.000000;,
+ -0.982963;-0.130527;-0.129409;,
+ -0.957662;-0.130527;-0.256605;,
+ -0.915976;-0.130527;-0.379410;,
+ -0.858616;-0.130527;-0.495722;,
+ -0.786566;-0.130527;-0.603553;,
+ -0.701057;-0.130527;-0.701057;,
+ -0.603553;-0.130527;-0.786566;,
+ -0.495722;-0.130527;-0.858616;,
+ -0.379410;-0.130527;-0.915976;,
+ -0.256605;-0.130527;-0.957662;,
+ -0.129409;-0.130527;-0.982963;,
+ 0.000000;-0.130527;-0.991445;,
+ 0.129409;-0.130527;-0.982963;,
+ 0.256605;-0.130527;-0.957662;,
+ 0.379410;-0.130527;-0.915976;,
+ 0.495722;-0.130527;-0.858616;,
+ 0.603553;-0.130527;-0.786566;,
+ 0.701057;-0.130527;-0.701057;,
+ 0.786566;-0.130527;-0.603553;,
+ 0.858616;-0.130527;-0.495722;,
+ 0.915976;-0.130527;-0.379410;,
+ 0.957662;-0.130527;-0.256605;,
+ 0.982963;-0.130527;-0.129409;,
+ 0.997859;-0.065403;0.000000;,
+ 0.989322;-0.065403;0.130247;,
+ 0.963858;-0.065403;0.258265;,
+ 0.921901;-0.065403;0.381864;,
+ 0.864171;-0.065403;0.498930;,
+ 0.791655;-0.065403;0.607458;,
+ 0.705593;-0.065403;0.705593;,
+ 0.607458;-0.065403;0.791655;,
+ 0.498930;-0.065403;0.864171;,
+ 0.381864;-0.065403;0.921901;,
+ 0.258265;-0.065403;0.963858;,
+ 0.130247;-0.065403;0.989322;,
+ 0.000000;-0.065404;0.997859;,
+ 0.000000;-0.065404;0.997859;,
+ -0.130247;-0.065403;0.989322;,
+ -0.258265;-0.065403;0.963858;,
+ -0.381864;-0.065403;0.921901;,
+ -0.498930;-0.065403;0.864171;,
+ -0.607458;-0.065403;0.791655;,
+ -0.705593;-0.065403;0.705593;,
+ -0.791655;-0.065403;0.607458;,
+ -0.864171;-0.065403;0.498930;,
+ -0.921901;-0.065403;0.381864;,
+ -0.963858;-0.065403;0.258265;,
+ -0.989322;-0.065403;0.130247;,
+ -0.997859;-0.065403;0.000000;,
+ -0.989322;-0.065403;-0.130247;,
+ -0.963858;-0.065403;-0.258265;,
+ -0.921901;-0.065403;-0.381864;,
+ -0.864171;-0.065403;-0.498930;,
+ -0.791655;-0.065403;-0.607458;,
+ -0.705593;-0.065403;-0.705593;,
+ -0.607458;-0.065403;-0.791655;,
+ -0.498930;-0.065403;-0.864171;,
+ -0.381864;-0.065403;-0.921901;,
+ -0.258265;-0.065403;-0.963858;,
+ -0.130247;-0.065403;-0.989322;,
+ 0.000000;-0.065403;-0.997859;,
+ 0.130247;-0.065403;-0.989322;,
+ 0.258265;-0.065403;-0.963858;,
+ 0.381864;-0.065403;-0.921901;,
+ 0.498930;-0.065403;-0.864171;,
+ 0.607458;-0.065403;-0.791655;,
+ 0.705593;-0.065403;-0.705593;,
+ 0.791655;-0.065403;-0.607458;,
+ 0.864171;-0.065403;-0.498930;,
+ 0.921901;-0.065403;-0.381864;,
+ 0.963858;-0.065403;-0.258265;,
+ 0.989322;-0.065403;-0.130247;,
+ 1.000000;0.000000;0.000000;,
+ 0.991445;0.000000;0.130526;,
+ 0.965926;-0.000000;0.258819;,
+ 0.923880;0.000000;0.382683;,
+ 0.866025;0.000000;0.500000;,
+ 0.793353;-0.000000;0.608761;,
+ 0.707107;0.000000;0.707107;,
+ 0.608761;0.000000;0.793353;,
+ 0.500000;-0.000000;0.866025;,
+ 0.382683;-0.000000;0.923880;,
+ 0.258819;0.000000;0.965926;,
+ 0.130526;0.000000;0.991445;,
+ 0.000000;-0.000000;1.000000;,
+ 0.000000;-0.000000;1.000000;,
+ -0.130526;0.000000;0.991445;,
+ -0.258819;0.000000;0.965926;,
+ -0.382683;-0.000000;0.923880;,
+ -0.500000;-0.000000;0.866025;,
+ -0.608761;0.000000;0.793353;,
+ -0.707107;0.000000;0.707107;,
+ -0.793353;-0.000000;0.608761;,
+ -0.866025;0.000000;0.500000;,
+ -0.923880;0.000000;0.382683;,
+ -0.965926;-0.000000;0.258819;,
+ -0.991445;0.000000;0.130526;,
+ -1.000000;0.000000;0.000000;,
+ -0.991445;0.000000;-0.130526;,
+ -0.965926;0.000000;-0.258819;,
+ -0.923880;-0.000000;-0.382683;,
+ -0.866025;-0.000000;-0.500000;,
+ -0.793353;0.000000;-0.608761;,
+ -0.707107;0.000000;-0.707107;,
+ -0.608761;-0.000000;-0.793353;,
+ -0.500000;0.000000;-0.866025;,
+ -0.382683;0.000000;-0.923880;,
+ -0.258819;-0.000000;-0.965926;,
+ -0.130526;0.000000;-0.991445;,
+ 0.000000;0.000000;-1.000000;,
+ 0.130526;0.000000;-0.991445;,
+ 0.258819;-0.000000;-0.965926;,
+ 0.382683;0.000000;-0.923880;,
+ 0.500000;0.000000;-0.866025;,
+ 0.608761;-0.000000;-0.793353;,
+ 0.707107;0.000000;-0.707107;,
+ 0.793353;0.000000;-0.608761;,
+ 0.866025;-0.000000;-0.500000;,
+ 0.923880;-0.000000;-0.382683;,
+ 0.965926;0.000000;-0.258819;,
+ 0.991445;0.000000;-0.130526;,
+ 0.997859;0.065403;0.000000;,
+ 0.989322;0.065403;0.130247;,
+ 0.963858;0.065403;0.258265;,
+ 0.921901;0.065403;0.381864;,
+ 0.864171;0.065403;0.498930;,
+ 0.791655;0.065403;0.607458;,
+ 0.705593;0.065403;0.705593;,
+ 0.607458;0.065403;0.791655;,
+ 0.498930;0.065403;0.864171;,
+ 0.381864;0.065403;0.921901;,
+ 0.258265;0.065403;0.963858;,
+ 0.130247;0.065403;0.989322;,
+ 0.000000;0.065404;0.997859;,
+ 0.000000;0.065404;0.997859;,
+ -0.130247;0.065403;0.989322;,
+ -0.258265;0.065403;0.963858;,
+ -0.381864;0.065403;0.921901;,
+ -0.498930;0.065403;0.864171;,
+ -0.607458;0.065403;0.791655;,
+ -0.705593;0.065403;0.705593;,
+ -0.791655;0.065403;0.607458;,
+ -0.864171;0.065403;0.498930;,
+ -0.921901;0.065403;0.381864;,
+ -0.963858;0.065403;0.258265;,
+ -0.989322;0.065403;0.130247;,
+ -0.997859;0.065403;0.000000;,
+ -0.989322;0.065403;-0.130247;,
+ -0.963858;0.065403;-0.258265;,
+ -0.921901;0.065403;-0.381864;,
+ -0.864171;0.065403;-0.498930;,
+ -0.791655;0.065403;-0.607458;,
+ -0.705593;0.065403;-0.705593;,
+ -0.607458;0.065403;-0.791655;,
+ -0.498930;0.065403;-0.864171;,
+ -0.381864;0.065403;-0.921901;,
+ -0.258265;0.065403;-0.963858;,
+ -0.130247;0.065403;-0.989322;,
+ 0.000000;0.065403;-0.997859;,
+ 0.130247;0.065403;-0.989322;,
+ 0.258265;0.065403;-0.963858;,
+ 0.381864;0.065403;-0.921901;,
+ 0.498930;0.065403;-0.864171;,
+ 0.607458;0.065403;-0.791655;,
+ 0.705593;0.065403;-0.705593;,
+ 0.791655;0.065403;-0.607458;,
+ 0.864171;0.065403;-0.498930;,
+ 0.921901;0.065403;-0.381864;,
+ 0.963858;0.065403;-0.258265;,
+ 0.989322;0.065403;-0.130247;,
+ 0.991445;0.130527;-0.000000;,
+ 0.982963;0.130527;0.129410;,
+ 0.957662;0.130527;0.256605;,
+ 0.915975;0.130527;0.379410;,
+ 0.858616;0.130527;0.495723;,
+ 0.786566;0.130527;0.603553;,
+ 0.701057;0.130527;0.701057;,
+ 0.603553;0.130527;0.786566;,
+ 0.495723;0.130527;0.858616;,
+ 0.379410;0.130527;0.915976;,
+ 0.256605;0.130527;0.957662;,
+ 0.129410;0.130527;0.982963;,
+ 0.000000;0.130527;0.991445;,
+ 0.000000;0.130527;0.991445;,
+ -0.129410;0.130527;0.982963;,
+ -0.256605;0.130527;0.957662;,
+ -0.379410;0.130527;0.915976;,
+ -0.495723;0.130527;0.858616;,
+ -0.603553;0.130527;0.786566;,
+ -0.701057;0.130527;0.701057;,
+ -0.786566;0.130527;0.603553;,
+ -0.858616;0.130527;0.495723;,
+ -0.915975;0.130527;0.379410;,
+ -0.957662;0.130527;0.256605;,
+ -0.982963;0.130527;0.129410;,
+ -0.991445;0.130527;-0.000000;,
+ -0.982963;0.130527;-0.129410;,
+ -0.957662;0.130527;-0.256605;,
+ -0.915976;0.130527;-0.379410;,
+ -0.858616;0.130527;-0.495723;,
+ -0.786566;0.130527;-0.603553;,
+ -0.701057;0.130527;-0.701057;,
+ -0.603553;0.130527;-0.786566;,
+ -0.495723;0.130527;-0.858616;,
+ -0.379410;0.130527;-0.915975;,
+ -0.256605;0.130527;-0.957662;,
+ -0.129410;0.130527;-0.982963;,
+ 0.000000;0.130527;-0.991445;,
+ 0.129410;0.130527;-0.982963;,
+ 0.256605;0.130527;-0.957662;,
+ 0.379410;0.130527;-0.915975;,
+ 0.495723;0.130527;-0.858616;,
+ 0.603553;0.130527;-0.786566;,
+ 0.701057;0.130527;-0.701057;,
+ 0.786566;0.130527;-0.603553;,
+ 0.858616;0.130527;-0.495723;,
+ 0.915976;0.130527;-0.379410;,
+ 0.957662;0.130527;-0.256605;,
+ 0.982963;0.130527;-0.129410;,
+ 0.980785;0.195091;-0.000000;,
+ 0.972394;0.195091;0.128018;,
+ 0.947366;0.195091;0.253846;,
+ 0.906127;0.195091;0.375330;,
+ 0.849385;0.195091;0.490393;,
+ 0.778109;0.195091;0.597064;,
+ 0.693520;0.195091;0.693520;,
+ 0.597064;0.195091;0.778109;,
+ 0.490393;0.195091;0.849385;,
+ 0.375330;0.195091;0.906127;,
+ 0.253846;0.195091;0.947366;,
+ 0.128018;0.195091;0.972394;,
+ 0.000000;0.195091;0.980785;,
+ 0.000000;0.195091;0.980785;,
+ -0.128018;0.195091;0.972394;,
+ -0.253846;0.195091;0.947366;,
+ -0.375330;0.195091;0.906127;,
+ -0.490393;0.195091;0.849385;,
+ -0.597064;0.195091;0.778109;,
+ -0.693520;0.195091;0.693520;,
+ -0.778109;0.195091;0.597064;,
+ -0.849385;0.195091;0.490393;,
+ -0.906127;0.195091;0.375330;,
+ -0.947366;0.195091;0.253846;,
+ -0.972394;0.195091;0.128018;,
+ -0.980785;0.195091;-0.000000;,
+ -0.972394;0.195091;-0.128018;,
+ -0.947366;0.195091;-0.253846;,
+ -0.906127;0.195091;-0.375330;,
+ -0.849385;0.195091;-0.490393;,
+ -0.778109;0.195091;-0.597064;,
+ -0.693520;0.195091;-0.693520;,
+ -0.597064;0.195091;-0.778109;,
+ -0.490393;0.195091;-0.849385;,
+ -0.375330;0.195091;-0.906127;,
+ -0.253846;0.195091;-0.947366;,
+ -0.128018;0.195091;-0.972394;,
+ 0.000000;0.195091;-0.980785;,
+ 0.128018;0.195091;-0.972394;,
+ 0.253846;0.195091;-0.947366;,
+ 0.375330;0.195091;-0.906127;,
+ 0.490393;0.195091;-0.849385;,
+ 0.597064;0.195091;-0.778109;,
+ 0.693520;0.195091;-0.693520;,
+ 0.778109;0.195091;-0.597064;,
+ 0.849385;0.195091;-0.490393;,
+ 0.906127;0.195091;-0.375330;,
+ 0.947366;0.195091;-0.253846;,
+ 0.972394;0.195091;-0.128018;,
+ 0.965926;0.258820;0.000000;,
+ 0.957662;0.258820;0.126078;,
+ 0.933012;0.258820;0.250000;,
+ 0.892399;0.258820;0.369644;,
+ 0.836516;0.258820;0.482963;,
+ 0.766320;0.258820;0.588018;,
+ 0.683012;0.258820;0.683012;,
+ 0.588018;0.258820;0.766320;,
+ 0.482963;0.258820;0.836516;,
+ 0.369644;0.258820;0.892399;,
+ 0.250000;0.258820;0.933012;,
+ 0.126078;0.258820;0.957662;,
+ 0.000000;0.258820;0.965926;,
+ 0.000000;0.258820;0.965926;,
+ -0.126078;0.258820;0.957662;,
+ -0.250000;0.258820;0.933012;,
+ -0.369644;0.258820;0.892399;,
+ -0.482963;0.258820;0.836516;,
+ -0.588018;0.258820;0.766320;,
+ -0.683012;0.258820;0.683012;,
+ -0.766320;0.258820;0.588018;,
+ -0.836516;0.258820;0.482963;,
+ -0.892399;0.258820;0.369644;,
+ -0.933012;0.258820;0.250000;,
+ -0.957662;0.258820;0.126078;,
+ -0.965926;0.258820;0.000000;,
+ -0.957662;0.258820;-0.126078;,
+ -0.933012;0.258820;-0.250000;,
+ -0.892399;0.258820;-0.369644;,
+ -0.836516;0.258820;-0.482963;,
+ -0.766320;0.258820;-0.588018;,
+ -0.683012;0.258820;-0.683012;,
+ -0.588018;0.258820;-0.766320;,
+ -0.482963;0.258820;-0.836516;,
+ -0.369644;0.258820;-0.892399;,
+ -0.250000;0.258820;-0.933012;,
+ -0.126078;0.258820;-0.957662;,
+ 0.000000;0.258820;-0.965926;,
+ 0.126078;0.258820;-0.957662;,
+ 0.250000;0.258820;-0.933012;,
+ 0.369644;0.258820;-0.892399;,
+ 0.482963;0.258820;-0.836516;,
+ 0.588018;0.258820;-0.766320;,
+ 0.683012;0.258820;-0.683012;,
+ 0.766320;0.258820;-0.588018;,
+ 0.836516;0.258820;-0.482963;,
+ 0.892399;0.258820;-0.369644;,
+ 0.933012;0.258820;-0.250000;,
+ 0.957662;0.258820;-0.126078;,
+ 0.946930;0.321441;-0.000000;,
+ 0.938829;0.321441;0.123599;,
+ 0.914664;0.321441;0.245083;,
+ 0.874849;0.321441;0.362374;,
+ 0.820065;0.321441;0.473465;,
+ 0.751250;0.321441;0.576454;,
+ 0.669580;0.321441;0.669580;,
+ 0.576454;0.321441;0.751250;,
+ 0.473465;0.321441;0.820065;,
+ 0.362374;0.321441;0.874849;,
+ 0.245083;0.321441;0.914664;,
+ 0.123599;0.321441;0.938829;,
+ 0.000000;0.321441;0.946930;,
+ 0.000000;0.321441;0.946930;,
+ -0.123599;0.321441;0.938829;,
+ -0.245083;0.321441;0.914664;,
+ -0.362374;0.321441;0.874849;,
+ -0.473465;0.321441;0.820065;,
+ -0.576454;0.321441;0.751250;,
+ -0.669580;0.321441;0.669580;,
+ -0.751250;0.321441;0.576454;,
+ -0.820065;0.321441;0.473465;,
+ -0.874849;0.321441;0.362374;,
+ -0.914664;0.321441;0.245083;,
+ -0.938829;0.321441;0.123599;,
+ -0.946930;0.321441;-0.000000;,
+ -0.938829;0.321441;-0.123599;,
+ -0.914664;0.321441;-0.245083;,
+ -0.874849;0.321441;-0.362374;,
+ -0.820065;0.321441;-0.473465;,
+ -0.751250;0.321441;-0.576454;,
+ -0.669580;0.321441;-0.669580;,
+ -0.576454;0.321441;-0.751250;,
+ -0.473465;0.321441;-0.820065;,
+ -0.362374;0.321441;-0.874849;,
+ -0.245083;0.321441;-0.914664;,
+ -0.123599;0.321441;-0.938829;,
+ 0.000000;0.321441;-0.946930;,
+ 0.123599;0.321441;-0.938829;,
+ 0.245083;0.321441;-0.914664;,
+ 0.362374;0.321441;-0.874849;,
+ 0.473465;0.321441;-0.820065;,
+ 0.576454;0.321441;-0.751250;,
+ 0.669580;0.321441;-0.669580;,
+ 0.751250;0.321441;-0.576454;,
+ 0.820065;0.321441;-0.473465;,
+ 0.874849;0.321441;-0.362374;,
+ 0.914664;0.321441;-0.245083;,
+ 0.938829;0.321441;-0.123599;,
+ 0.923879;0.382685;0.000000;,
+ 0.915975;0.382685;0.120590;,
+ 0.892399;0.382685;0.239117;,
+ 0.853553;0.382685;0.353553;,
+ 0.800103;0.382685;0.461939;,
+ 0.732962;0.382685;0.562422;,
+ 0.653281;0.382685;0.653281;,
+ 0.562422;0.382685;0.732962;,
+ 0.461940;0.382685;0.800103;,
+ 0.353553;0.382685;0.853553;,
+ 0.239117;0.382685;0.892399;,
+ 0.120590;0.382685;0.915975;,
+ 0.000000;0.382685;0.923879;,
+ 0.000000;0.382685;0.923879;,
+ -0.120590;0.382685;0.915975;,
+ -0.239117;0.382685;0.892399;,
+ -0.353553;0.382685;0.853553;,
+ -0.461940;0.382685;0.800103;,
+ -0.562422;0.382685;0.732962;,
+ -0.653281;0.382685;0.653281;,
+ -0.732962;0.382685;0.562422;,
+ -0.800103;0.382685;0.461939;,
+ -0.853553;0.382685;0.353553;,
+ -0.892399;0.382685;0.239117;,
+ -0.915975;0.382685;0.120590;,
+ -0.923879;0.382685;0.000000;,
+ -0.915975;0.382685;-0.120590;,
+ -0.892399;0.382685;-0.239117;,
+ -0.853553;0.382685;-0.353553;,
+ -0.800103;0.382685;-0.461940;,
+ -0.732962;0.382685;-0.562422;,
+ -0.653281;0.382685;-0.653281;,
+ -0.562422;0.382685;-0.732962;,
+ -0.461939;0.382685;-0.800103;,
+ -0.353553;0.382685;-0.853553;,
+ -0.239117;0.382685;-0.892399;,
+ -0.120590;0.382685;-0.915975;,
+ 0.000000;0.382685;-0.923879;,
+ 0.120590;0.382685;-0.915975;,
+ 0.239117;0.382685;-0.892399;,
+ 0.353553;0.382685;-0.853553;,
+ 0.461939;0.382685;-0.800103;,
+ 0.562422;0.382685;-0.732962;,
+ 0.653281;0.382685;-0.653281;,
+ 0.732962;0.382685;-0.562422;,
+ 0.800103;0.382685;-0.461940;,
+ 0.853553;0.382685;-0.353553;,
+ 0.892399;0.382685;-0.239117;,
+ 0.915975;0.382685;-0.120590;,
+ 0.896872;0.442290;0.000000;,
+ 0.889199;0.442290;0.117065;,
+ 0.866312;0.442290;0.232128;,
+ 0.828602;0.442290;0.343218;,
+ 0.776714;0.442290;0.448436;,
+ 0.711536;0.442290;0.545981;,
+ 0.634184;0.442290;0.634184;,
+ 0.545981;0.442290;0.711536;,
+ 0.448436;0.442290;0.776714;,
+ 0.343218;0.442290;0.828602;,
+ 0.232127;0.442290;0.866312;,
+ 0.117065;0.442290;0.889199;,
+ 0.000000;0.442291;0.896872;,
+ 0.000000;0.442291;0.896872;,
+ -0.117065;0.442290;0.889199;,
+ -0.232127;0.442290;0.866312;,
+ -0.343218;0.442290;0.828602;,
+ -0.448436;0.442290;0.776714;,
+ -0.545981;0.442290;0.711536;,
+ -0.634184;0.442290;0.634184;,
+ -0.711536;0.442290;0.545981;,
+ -0.776714;0.442290;0.448436;,
+ -0.828602;0.442290;0.343218;,
+ -0.866312;0.442290;0.232128;,
+ -0.889199;0.442290;0.117065;,
+ -0.896872;0.442290;0.000000;,
+ -0.889199;0.442290;-0.117065;,
+ -0.866312;0.442290;-0.232127;,
+ -0.828602;0.442290;-0.343218;,
+ -0.776714;0.442290;-0.448436;,
+ -0.711536;0.442290;-0.545981;,
+ -0.634184;0.442290;-0.634184;,
+ -0.545981;0.442290;-0.711536;,
+ -0.448436;0.442290;-0.776714;,
+ -0.343218;0.442290;-0.828602;,
+ -0.232128;0.442290;-0.866312;,
+ -0.117065;0.442290;-0.889199;,
+ 0.000000;0.442290;-0.896872;,
+ 0.117065;0.442290;-0.889199;,
+ 0.232128;0.442290;-0.866312;,
+ 0.343218;0.442290;-0.828602;,
+ 0.448436;0.442290;-0.776714;,
+ 0.545981;0.442290;-0.711536;,
+ 0.634184;0.442290;-0.634184;,
+ 0.711536;0.442290;-0.545981;,
+ 0.776714;0.442290;-0.448436;,
+ 0.828602;0.442290;-0.343218;,
+ 0.866312;0.442290;-0.232127;,
+ 0.889199;0.442290;-0.117065;,
+ 0.866024;0.500002;-0.000000;,
+ 0.858615;0.500002;0.113039;,
+ 0.836515;0.500002;0.224144;,
+ 0.800102;0.500002;0.331413;,
+ 0.749999;0.500002;0.433012;,
+ 0.687063;0.500002;0.527202;,
+ 0.612372;0.500002;0.612372;,
+ 0.527202;0.500002;0.687063;,
+ 0.433012;0.500002;0.749999;,
+ 0.331413;0.500002;0.800102;,
+ 0.224144;0.500002;0.836515;,
+ 0.113039;0.500002;0.858615;,
+ 0.000000;0.500002;0.866024;,
+ 0.000000;0.500002;0.866024;,
+ -0.113039;0.500002;0.858615;,
+ -0.224144;0.500002;0.836515;,
+ -0.331413;0.500002;0.800102;,
+ -0.433012;0.500002;0.749999;,
+ -0.527202;0.500002;0.687063;,
+ -0.612372;0.500002;0.612372;,
+ -0.687063;0.500002;0.527202;,
+ -0.749999;0.500002;0.433012;,
+ -0.800102;0.500002;0.331413;,
+ -0.836515;0.500002;0.224144;,
+ -0.858615;0.500002;0.113039;,
+ -0.866024;0.500002;-0.000000;,
+ -0.858615;0.500002;-0.113039;,
+ -0.836515;0.500002;-0.224144;,
+ -0.800102;0.500002;-0.331413;,
+ -0.749999;0.500002;-0.433012;,
+ -0.687063;0.500002;-0.527202;,
+ -0.612372;0.500002;-0.612372;,
+ -0.527202;0.500002;-0.687063;,
+ -0.433012;0.500002;-0.749999;,
+ -0.331413;0.500002;-0.800102;,
+ -0.224144;0.500002;-0.836515;,
+ -0.113039;0.500002;-0.858615;,
+ 0.000000;0.500002;-0.866024;,
+ 0.113039;0.500002;-0.858615;,
+ 0.224144;0.500002;-0.836515;,
+ 0.331413;0.500002;-0.800102;,
+ 0.433012;0.500002;-0.749999;,
+ 0.527202;0.500002;-0.687063;,
+ 0.612372;0.500002;-0.612372;,
+ 0.687063;0.500002;-0.527202;,
+ 0.749999;0.500002;-0.433012;,
+ 0.800102;0.500002;-0.331413;,
+ 0.836515;0.500002;-0.224144;,
+ 0.858615;0.500002;-0.113039;,
+ 0.831468;0.555572;-0.000000;,
+ 0.824355;0.555572;0.108528;,
+ 0.803137;0.555572;0.215200;,
+ 0.768177;0.555572;0.318189;,
+ 0.720073;0.555572;0.415734;,
+ 0.659648;0.555572;0.506166;,
+ 0.587937;0.555572;0.587937;,
+ 0.506166;0.555572;0.659648;,
+ 0.415734;0.555572;0.720073;,
+ 0.318189;0.555572;0.768177;,
+ 0.215200;0.555572;0.803137;,
+ 0.108528;0.555572;0.824355;,
+ 0.000000;0.555572;0.831468;,
+ 0.000000;0.555572;0.831468;,
+ -0.108528;0.555572;0.824355;,
+ -0.215200;0.555572;0.803137;,
+ -0.318189;0.555572;0.768177;,
+ -0.415734;0.555572;0.720073;,
+ -0.506166;0.555572;0.659648;,
+ -0.587937;0.555572;0.587937;,
+ -0.659648;0.555572;0.506166;,
+ -0.720073;0.555572;0.415734;,
+ -0.768177;0.555572;0.318189;,
+ -0.803137;0.555572;0.215200;,
+ -0.824355;0.555572;0.108528;,
+ -0.831468;0.555572;-0.000000;,
+ -0.824355;0.555572;-0.108528;,
+ -0.803137;0.555572;-0.215200;,
+ -0.768177;0.555572;-0.318189;,
+ -0.720073;0.555572;-0.415734;,
+ -0.659648;0.555572;-0.506166;,
+ -0.587937;0.555572;-0.587937;,
+ -0.506166;0.555572;-0.659648;,
+ -0.415734;0.555572;-0.720073;,
+ -0.318189;0.555572;-0.768177;,
+ -0.215200;0.555572;-0.803137;,
+ -0.108528;0.555572;-0.824355;,
+ 0.000000;0.555572;-0.831468;,
+ 0.108528;0.555572;-0.824355;,
+ 0.215200;0.555572;-0.803137;,
+ 0.318189;0.555572;-0.768177;,
+ 0.415734;0.555572;-0.720073;,
+ 0.506166;0.555572;-0.659648;,
+ 0.587937;0.555572;-0.587937;,
+ 0.659648;0.555572;-0.506166;,
+ 0.720073;0.555572;-0.415734;,
+ 0.768177;0.555572;-0.318189;,
+ 0.803137;0.555572;-0.215200;,
+ 0.824355;0.555572;-0.108528;,
+ 0.793352;0.608763;0.000000;,
+ 0.786565;0.608763;0.103553;,
+ 0.766319;0.608763;0.205335;,
+ 0.732962;0.608763;0.303603;,
+ 0.687063;0.608763;0.396676;,
+ 0.629408;0.608763;0.482962;,
+ 0.560985;0.608763;0.560985;,
+ 0.482962;0.608763;0.629408;,
+ 0.396676;0.608763;0.687063;,
+ 0.303603;0.608763;0.732962;,
+ 0.205335;0.608763;0.766319;,
+ 0.103553;0.608763;0.786565;,
+ 0.000000;0.608763;0.793352;,
+ 0.000000;0.608763;0.793352;,
+ -0.103553;0.608763;0.786565;,
+ -0.205335;0.608763;0.766319;,
+ -0.303603;0.608763;0.732962;,
+ -0.396676;0.608763;0.687063;,
+ -0.482962;0.608763;0.629408;,
+ -0.560985;0.608763;0.560985;,
+ -0.629408;0.608763;0.482962;,
+ -0.687063;0.608763;0.396676;,
+ -0.732962;0.608763;0.303603;,
+ -0.766319;0.608763;0.205335;,
+ -0.786565;0.608763;0.103553;,
+ -0.793352;0.608763;0.000000;,
+ -0.786565;0.608763;-0.103553;,
+ -0.766319;0.608763;-0.205335;,
+ -0.732962;0.608763;-0.303603;,
+ -0.687063;0.608763;-0.396676;,
+ -0.629408;0.608763;-0.482962;,
+ -0.560985;0.608763;-0.560985;,
+ -0.482962;0.608763;-0.629408;,
+ -0.396676;0.608763;-0.687063;,
+ -0.303603;0.608763;-0.732962;,
+ -0.205335;0.608763;-0.766319;,
+ -0.103553;0.608763;-0.786565;,
+ 0.000000;0.608763;-0.793352;,
+ 0.103553;0.608763;-0.786565;,
+ 0.205335;0.608763;-0.766319;,
+ 0.303603;0.608763;-0.732962;,
+ 0.396676;0.608763;-0.687063;,
+ 0.482962;0.608763;-0.629408;,
+ 0.560985;0.608763;-0.560985;,
+ 0.629408;0.608763;-0.482962;,
+ 0.687063;0.608763;-0.396676;,
+ 0.732962;0.608763;-0.303603;,
+ 0.766319;0.608763;-0.205335;,
+ 0.786565;0.608763;-0.103553;,
+ 0.751838;0.659348;0.000000;,
+ 0.745406;0.659348;0.098135;,
+ 0.726220;0.659347;0.194590;,
+ 0.694608;0.659347;0.287716;,
+ 0.651111;0.659347;0.375919;,
+ 0.596473;0.659348;0.457690;,
+ 0.531630;0.659348;0.531630;,
+ 0.457690;0.659348;0.596473;,
+ 0.375919;0.659348;0.651111;,
+ 0.287716;0.659347;0.694608;,
+ 0.194590;0.659347;0.726220;,
+ 0.098135;0.659347;0.745406;,
+ 0.000000;0.659348;0.751838;,
+ 0.000000;0.659348;0.751838;,
+ -0.098135;0.659347;0.745406;,
+ -0.194590;0.659347;0.726220;,
+ -0.287716;0.659347;0.694608;,
+ -0.375919;0.659348;0.651111;,
+ -0.457690;0.659348;0.596473;,
+ -0.531630;0.659348;0.531630;,
+ -0.596473;0.659348;0.457690;,
+ -0.651111;0.659347;0.375919;,
+ -0.694608;0.659347;0.287716;,
+ -0.726220;0.659347;0.194590;,
+ -0.745406;0.659348;0.098135;,
+ -0.751838;0.659348;0.000000;,
+ -0.745406;0.659347;-0.098135;,
+ -0.726220;0.659347;-0.194590;,
+ -0.694608;0.659347;-0.287716;,
+ -0.651111;0.659348;-0.375919;,
+ -0.596473;0.659348;-0.457690;,
+ -0.531630;0.659348;-0.531630;,
+ -0.457690;0.659348;-0.596473;,
+ -0.375919;0.659347;-0.651111;,
+ -0.287716;0.659347;-0.694608;,
+ -0.194590;0.659347;-0.726220;,
+ -0.098135;0.659348;-0.745406;,
+ 0.000000;0.659348;-0.751838;,
+ 0.098135;0.659348;-0.745406;,
+ 0.194590;0.659347;-0.726220;,
+ 0.287716;0.659347;-0.694608;,
+ 0.375919;0.659347;-0.651111;,
+ 0.457690;0.659348;-0.596473;,
+ 0.531630;0.659348;-0.531630;,
+ 0.596473;0.659348;-0.457690;,
+ 0.651111;0.659348;-0.375919;,
+ 0.694608;0.659347;-0.287716;,
+ 0.726220;0.659347;-0.194590;,
+ 0.745406;0.659347;-0.098135;,
+ 0.707105;0.707108;-0.000000;,
+ 0.701056;0.707108;0.092296;,
+ 0.683011;0.707108;0.183012;,
+ 0.653280;0.707108;0.270597;,
+ 0.612371;0.707108;0.353553;,
+ 0.560984;0.707108;0.430458;,
+ 0.499999;0.707108;0.499999;,
+ 0.430458;0.707108;0.560984;,
+ 0.353553;0.707108;0.612371;,
+ 0.270597;0.707108;0.653280;,
+ 0.183012;0.707108;0.683011;,
+ 0.092296;0.707108;0.701056;,
+ 0.000000;0.707108;0.707105;,
+ 0.000000;0.707108;0.707105;,
+ -0.092296;0.707108;0.701056;,
+ -0.183012;0.707108;0.683011;,
+ -0.270597;0.707108;0.653280;,
+ -0.353553;0.707108;0.612371;,
+ -0.430458;0.707108;0.560984;,
+ -0.499999;0.707108;0.499999;,
+ -0.560984;0.707108;0.430458;,
+ -0.612371;0.707108;0.353553;,
+ -0.653280;0.707108;0.270597;,
+ -0.683011;0.707108;0.183012;,
+ -0.701056;0.707108;0.092296;,
+ -0.707105;0.707108;-0.000000;,
+ -0.701056;0.707108;-0.092296;,
+ -0.683011;0.707108;-0.183012;,
+ -0.653280;0.707108;-0.270597;,
+ -0.612371;0.707108;-0.353553;,
+ -0.560984;0.707108;-0.430458;,
+ -0.499999;0.707108;-0.499999;,
+ -0.430458;0.707108;-0.560984;,
+ -0.353553;0.707108;-0.612371;,
+ -0.270597;0.707108;-0.653280;,
+ -0.183012;0.707108;-0.683011;,
+ -0.092296;0.707108;-0.701056;,
+ 0.000000;0.707108;-0.707105;,
+ 0.092296;0.707108;-0.701056;,
+ 0.183012;0.707108;-0.683011;,
+ 0.270597;0.707108;-0.653280;,
+ 0.353553;0.707108;-0.612371;,
+ 0.430458;0.707108;-0.560984;,
+ 0.499999;0.707108;-0.499999;,
+ 0.560984;0.707108;-0.430458;,
+ 0.612371;0.707108;-0.353553;,
+ 0.653280;0.707108;-0.270597;,
+ 0.683011;0.707108;-0.183012;,
+ 0.701056;0.707108;-0.092296;,
+ 0.659344;0.751841;-0.000000;,
+ 0.653703;0.751841;0.086062;,
+ 0.636877;0.751841;0.170651;,
+ 0.609154;0.751841;0.252320;,
+ 0.571009;0.751841;0.329672;,
+ 0.523093;0.751841;0.401383;,
+ 0.466227;0.751841;0.466227;,
+ 0.401383;0.751841;0.523093;,
+ 0.329672;0.751841;0.571009;,
+ 0.252320;0.751841;0.609154;,
+ 0.170651;0.751841;0.636877;,
+ 0.086062;0.751841;0.653703;,
+ 0.000000;0.751841;0.659344;,
+ 0.000000;0.751841;0.659344;,
+ -0.086062;0.751841;0.653703;,
+ -0.170651;0.751841;0.636877;,
+ -0.252320;0.751841;0.609154;,
+ -0.329672;0.751841;0.571009;,
+ -0.401383;0.751841;0.523093;,
+ -0.466227;0.751841;0.466227;,
+ -0.523093;0.751841;0.401383;,
+ -0.571009;0.751841;0.329672;,
+ -0.609154;0.751841;0.252320;,
+ -0.636877;0.751841;0.170651;,
+ -0.653703;0.751841;0.086062;,
+ -0.659344;0.751841;-0.000000;,
+ -0.653703;0.751841;-0.086062;,
+ -0.636877;0.751841;-0.170651;,
+ -0.609154;0.751841;-0.252320;,
+ -0.571009;0.751841;-0.329672;,
+ -0.523093;0.751841;-0.401383;,
+ -0.466227;0.751841;-0.466227;,
+ -0.401383;0.751841;-0.523093;,
+ -0.329672;0.751841;-0.571009;,
+ -0.252320;0.751841;-0.609154;,
+ -0.170651;0.751841;-0.636877;,
+ -0.086062;0.751841;-0.653703;,
+ 0.000000;0.751841;-0.659344;,
+ 0.086062;0.751841;-0.653703;,
+ 0.170651;0.751841;-0.636877;,
+ 0.252320;0.751841;-0.609154;,
+ 0.329672;0.751841;-0.571009;,
+ 0.401383;0.751841;-0.523093;,
+ 0.466227;0.751841;-0.466227;,
+ 0.523093;0.751841;-0.401383;,
+ 0.571009;0.751841;-0.329672;,
+ 0.609154;0.751841;-0.252320;,
+ 0.636877;0.751841;-0.170651;,
+ 0.653703;0.751841;-0.086062;,
+ 0.608760;0.793355;0.000000;,
+ 0.603552;0.793355;0.079459;,
+ 0.588017;0.793355;0.157559;,
+ 0.562420;0.793355;0.232962;,
+ 0.527201;0.793355;0.304380;,
+ 0.482961;0.793355;0.370589;,
+ 0.430458;0.793355;0.430458;,
+ 0.370589;0.793355;0.482961;,
+ 0.304380;0.793355;0.527201;,
+ 0.232962;0.793355;0.562420;,
+ 0.157559;0.793355;0.588017;,
+ 0.079459;0.793355;0.603552;,
+ 0.000000;0.793355;0.608760;,
+ 0.000000;0.793355;0.608760;,
+ -0.079459;0.793355;0.603552;,
+ -0.157559;0.793355;0.588017;,
+ -0.232962;0.793355;0.562420;,
+ -0.304380;0.793355;0.527201;,
+ -0.370589;0.793355;0.482961;,
+ -0.430458;0.793355;0.430458;,
+ -0.482961;0.793355;0.370589;,
+ -0.527201;0.793355;0.304380;,
+ -0.562420;0.793355;0.232962;,
+ -0.588017;0.793355;0.157559;,
+ -0.603552;0.793355;0.079459;,
+ -0.608760;0.793355;0.000000;,
+ -0.603552;0.793355;-0.079459;,
+ -0.588017;0.793355;-0.157559;,
+ -0.562420;0.793355;-0.232962;,
+ -0.527201;0.793355;-0.304380;,
+ -0.482961;0.793355;-0.370589;,
+ -0.430458;0.793355;-0.430458;,
+ -0.370589;0.793355;-0.482961;,
+ -0.304380;0.793355;-0.527201;,
+ -0.232962;0.793355;-0.562420;,
+ -0.157559;0.793355;-0.588017;,
+ -0.079459;0.793355;-0.603552;,
+ 0.000000;0.793355;-0.608760;,
+ 0.079459;0.793355;-0.603552;,
+ 0.157559;0.793355;-0.588017;,
+ 0.232962;0.793355;-0.562420;,
+ 0.304380;0.793355;-0.527201;,
+ 0.370589;0.793355;-0.482961;,
+ 0.430458;0.793355;-0.430458;,
+ 0.482961;0.793355;-0.370589;,
+ 0.527201;0.793355;-0.304380;,
+ 0.562420;0.793355;-0.232962;,
+ 0.588017;0.793355;-0.157559;,
+ 0.603552;0.793355;-0.079459;,
+ 0.555568;0.831471;0.000000;,
+ 0.550816;0.831471;0.072516;,
+ 0.536638;0.831471;0.143792;,
+ 0.513278;0.831471;0.212607;,
+ 0.481136;0.831471;0.277784;,
+ 0.440762;0.831471;0.338209;,
+ 0.392846;0.831471;0.392846;,
+ 0.338209;0.831471;0.440762;,
+ 0.277784;0.831471;0.481136;,
+ 0.212607;0.831471;0.513278;,
+ 0.143792;0.831471;0.536638;,
+ 0.072516;0.831471;0.550816;,
+ 0.000000;0.831471;0.555568;,
+ 0.000000;0.831471;0.555568;,
+ -0.072516;0.831471;0.550816;,
+ -0.143792;0.831471;0.536638;,
+ -0.212607;0.831471;0.513278;,
+ -0.277784;0.831471;0.481136;,
+ -0.338209;0.831471;0.440762;,
+ -0.392846;0.831471;0.392846;,
+ -0.440762;0.831471;0.338209;,
+ -0.481136;0.831471;0.277784;,
+ -0.513278;0.831471;0.212607;,
+ -0.536638;0.831471;0.143792;,
+ -0.550816;0.831471;0.072516;,
+ -0.555568;0.831471;0.000000;,
+ -0.550816;0.831471;-0.072516;,
+ -0.536638;0.831471;-0.143792;,
+ -0.513278;0.831471;-0.212607;,
+ -0.481136;0.831471;-0.277784;,
+ -0.440762;0.831471;-0.338209;,
+ -0.392846;0.831471;-0.392846;,
+ -0.338209;0.831471;-0.440762;,
+ -0.277784;0.831471;-0.481136;,
+ -0.212607;0.831471;-0.513278;,
+ -0.143792;0.831471;-0.536638;,
+ -0.072516;0.831471;-0.550816;,
+ 0.000000;0.831471;-0.555569;,
+ 0.072516;0.831471;-0.550816;,
+ 0.143792;0.831471;-0.536638;,
+ 0.212607;0.831471;-0.513278;,
+ 0.277784;0.831471;-0.481136;,
+ 0.338209;0.831471;-0.440762;,
+ 0.392846;0.831471;-0.392846;,
+ 0.440762;0.831471;-0.338209;,
+ 0.481136;0.831471;-0.277784;,
+ 0.513278;0.831471;-0.212607;,
+ 0.536638;0.831471;-0.143792;,
+ 0.550816;0.831471;-0.072516;,
+ 0.499998;0.866026;-0.000000;,
+ 0.495721;0.866026;0.065263;,
+ 0.482961;0.866026;0.129409;,
+ 0.461938;0.866026;0.191341;,
+ 0.433011;0.866026;0.249999;,
+ 0.396675;0.866026;0.304380;,
+ 0.353552;0.866026;0.353552;,
+ 0.304380;0.866026;0.396675;,
+ 0.249999;0.866026;0.433011;,
+ 0.191341;0.866026;0.461938;,
+ 0.129409;0.866026;0.482961;,
+ 0.065263;0.866026;0.495721;,
+ 0.000000;0.866026;0.499998;,
+ 0.000000;0.866026;0.499998;,
+ -0.065263;0.866026;0.495721;,
+ -0.129409;0.866026;0.482961;,
+ -0.191341;0.866026;0.461938;,
+ -0.249999;0.866026;0.433011;,
+ -0.304380;0.866026;0.396675;,
+ -0.353552;0.866026;0.353552;,
+ -0.396675;0.866026;0.304380;,
+ -0.433011;0.866026;0.249999;,
+ -0.461938;0.866026;0.191341;,
+ -0.482961;0.866026;0.129409;,
+ -0.495721;0.866026;0.065263;,
+ -0.499998;0.866026;-0.000000;,
+ -0.495721;0.866026;-0.065263;,
+ -0.482961;0.866026;-0.129409;,
+ -0.461938;0.866026;-0.191341;,
+ -0.433011;0.866026;-0.249999;,
+ -0.396675;0.866026;-0.304380;,
+ -0.353552;0.866026;-0.353552;,
+ -0.304380;0.866026;-0.396675;,
+ -0.249999;0.866026;-0.433011;,
+ -0.191341;0.866026;-0.461938;,
+ -0.129409;0.866026;-0.482961;,
+ -0.065263;0.866026;-0.495721;,
+ 0.000000;0.866026;-0.499998;,
+ 0.065263;0.866026;-0.495721;,
+ 0.129409;0.866026;-0.482961;,
+ 0.191341;0.866026;-0.461938;,
+ 0.249999;0.866026;-0.433011;,
+ 0.304380;0.866026;-0.396675;,
+ 0.353552;0.866026;-0.353552;,
+ 0.396675;0.866026;-0.304380;,
+ 0.433011;0.866026;-0.249999;,
+ 0.461938;0.866026;-0.191341;,
+ 0.482961;0.866026;-0.129409;,
+ 0.495721;0.866026;-0.065263;,
+ 0.442287;0.896874;0.000000;,
+ 0.438503;0.896874;0.057730;,
+ 0.427216;0.896874;0.114472;,
+ 0.408620;0.896874;0.169256;,
+ 0.383032;0.896874;0.221143;,
+ 0.350890;0.896874;0.269247;,
+ 0.312744;0.896874;0.312744;,
+ 0.269247;0.896874;0.350890;,
+ 0.221143;0.896874;0.383032;,
+ 0.169256;0.896874;0.408620;,
+ 0.114472;0.896874;0.427216;,
+ 0.057730;0.896874;0.438503;,
+ 0.000000;0.896874;0.442287;,
+ 0.000000;0.896874;0.442287;,
+ -0.057730;0.896874;0.438503;,
+ -0.114472;0.896874;0.427216;,
+ -0.169256;0.896874;0.408620;,
+ -0.221143;0.896874;0.383032;,
+ -0.269247;0.896874;0.350890;,
+ -0.312744;0.896874;0.312744;,
+ -0.350890;0.896874;0.269247;,
+ -0.383032;0.896874;0.221143;,
+ -0.408620;0.896874;0.169256;,
+ -0.427216;0.896874;0.114472;,
+ -0.438503;0.896874;0.057730;,
+ -0.442287;0.896874;0.000000;,
+ -0.438503;0.896874;-0.057730;,
+ -0.427216;0.896874;-0.114472;,
+ -0.408620;0.896874;-0.169256;,
+ -0.383032;0.896874;-0.221143;,
+ -0.350890;0.896874;-0.269247;,
+ -0.312744;0.896874;-0.312744;,
+ -0.269247;0.896874;-0.350890;,
+ -0.221143;0.896874;-0.383032;,
+ -0.169256;0.896874;-0.408620;,
+ -0.114472;0.896874;-0.427216;,
+ -0.057730;0.896874;-0.438503;,
+ 0.000000;0.896874;-0.442287;,
+ 0.057730;0.896874;-0.438503;,
+ 0.114472;0.896874;-0.427216;,
+ 0.169256;0.896874;-0.408620;,
+ 0.221143;0.896874;-0.383032;,
+ 0.269247;0.896874;-0.350890;,
+ 0.312744;0.896874;-0.312744;,
+ 0.350890;0.896874;-0.269247;,
+ 0.383032;0.896874;-0.221143;,
+ 0.408620;0.896874;-0.169256;,
+ 0.427216;0.896874;-0.114472;,
+ 0.438503;0.896874;-0.057730;,
+ 0.382682;0.923880;0.000000;,
+ 0.379408;0.923880;0.049950;,
+ 0.369642;0.923880;0.099045;,
+ 0.353552;0.923880;0.146446;,
+ 0.331412;0.923880;0.191341;,
+ 0.303602;0.923880;0.232962;,
+ 0.270597;0.923880;0.270597;,
+ 0.232962;0.923880;0.303602;,
+ 0.191341;0.923880;0.331412;,
+ 0.146446;0.923880;0.353552;,
+ 0.099045;0.923880;0.369642;,
+ 0.049950;0.923880;0.379408;,
+ 0.000000;0.923880;0.382682;,
+ 0.000000;0.923880;0.382682;,
+ -0.049950;0.923880;0.379408;,
+ -0.099045;0.923880;0.369642;,
+ -0.146446;0.923880;0.353552;,
+ -0.191341;0.923880;0.331412;,
+ -0.232962;0.923880;0.303602;,
+ -0.270597;0.923880;0.270597;,
+ -0.303602;0.923880;0.232962;,
+ -0.331412;0.923880;0.191341;,
+ -0.353552;0.923880;0.146446;,
+ -0.369642;0.923880;0.099045;,
+ -0.379408;0.923880;0.049950;,
+ -0.382682;0.923880;0.000000;,
+ -0.379408;0.923880;-0.049950;,
+ -0.369642;0.923880;-0.099045;,
+ -0.353552;0.923880;-0.146446;,
+ -0.331412;0.923880;-0.191341;,
+ -0.303602;0.923880;-0.232962;,
+ -0.270597;0.923880;-0.270597;,
+ -0.232962;0.923880;-0.303602;,
+ -0.191341;0.923880;-0.331412;,
+ -0.146446;0.923880;-0.353552;,
+ -0.099045;0.923880;-0.369642;,
+ -0.049950;0.923880;-0.379408;,
+ 0.000000;0.923880;-0.382682;,
+ 0.049950;0.923880;-0.379408;,
+ 0.099045;0.923880;-0.369642;,
+ 0.146446;0.923880;-0.353552;,
+ 0.191341;0.923880;-0.331412;,
+ 0.232962;0.923880;-0.303602;,
+ 0.270597;0.923880;-0.270597;,
+ 0.303602;0.923880;-0.232962;,
+ 0.331412;0.923880;-0.191341;,
+ 0.353552;0.923880;-0.146446;,
+ 0.369642;0.923880;-0.099045;,
+ 0.379408;0.923880;-0.049950;,
+ 0.321438;0.946931;0.000000;,
+ 0.318688;0.946931;0.041956;,
+ 0.310486;0.946931;0.083194;,
+ 0.296970;0.946931;0.123009;,
+ 0.278374;0.946931;0.160719;,
+ 0.255014;0.946931;0.195679;,
+ 0.227291;0.946931;0.227291;,
+ 0.195679;0.946931;0.255014;,
+ 0.160719;0.946931;0.278374;,
+ 0.123009;0.946931;0.296970;,
+ 0.083194;0.946931;0.310486;,
+ 0.041956;0.946931;0.318688;,
+ 0.000000;0.946931;0.321438;,
+ 0.000000;0.946931;0.321438;,
+ -0.041956;0.946931;0.318688;,
+ -0.083194;0.946931;0.310486;,
+ -0.123009;0.946931;0.296970;,
+ -0.160719;0.946931;0.278374;,
+ -0.195679;0.946931;0.255014;,
+ -0.227291;0.946931;0.227291;,
+ -0.255014;0.946931;0.195679;,
+ -0.278374;0.946931;0.160719;,
+ -0.296970;0.946931;0.123009;,
+ -0.310486;0.946931;0.083194;,
+ -0.318688;0.946931;0.041956;,
+ -0.321438;0.946931;0.000000;,
+ -0.318688;0.946931;-0.041956;,
+ -0.310486;0.946931;-0.083194;,
+ -0.296970;0.946931;-0.123009;,
+ -0.278374;0.946931;-0.160719;,
+ -0.255014;0.946931;-0.195679;,
+ -0.227291;0.946931;-0.227291;,
+ -0.195679;0.946931;-0.255014;,
+ -0.160719;0.946931;-0.278374;,
+ -0.123009;0.946931;-0.296970;,
+ -0.083194;0.946931;-0.310486;,
+ -0.041956;0.946931;-0.318688;,
+ 0.000000;0.946931;-0.321438;,
+ 0.041956;0.946931;-0.318688;,
+ 0.083194;0.946931;-0.310486;,
+ 0.123009;0.946931;-0.296970;,
+ 0.160719;0.946931;-0.278374;,
+ 0.195679;0.946931;-0.255014;,
+ 0.227291;0.946931;-0.227291;,
+ 0.255014;0.946931;-0.195679;,
+ 0.278374;0.946931;-0.160719;,
+ 0.296970;0.946931;-0.123009;,
+ 0.310486;0.946931;-0.083194;,
+ 0.318688;0.946931;-0.041956;,
+ 0.258818;0.965926;-0.000000;,
+ 0.256604;0.965926;0.033783;,
+ 0.249999;0.965926;0.066987;,
+ 0.239117;0.965926;0.099045;,
+ 0.224143;0.965926;0.129409;,
+ 0.205334;0.965926;0.157558;,
+ 0.183012;0.965926;0.183012;,
+ 0.157558;0.965926;0.205334;,
+ 0.129409;0.965926;0.224143;,
+ 0.099045;0.965926;0.239117;,
+ 0.066987;0.965926;0.249999;,
+ 0.033783;0.965926;0.256604;,
+ 0.000000;0.965926;0.258818;,
+ 0.000000;0.965926;0.258818;,
+ -0.033783;0.965926;0.256604;,
+ -0.066987;0.965926;0.249999;,
+ -0.099045;0.965926;0.239117;,
+ -0.129409;0.965926;0.224143;,
+ -0.157558;0.965926;0.205334;,
+ -0.183012;0.965926;0.183012;,
+ -0.205334;0.965926;0.157558;,
+ -0.224143;0.965926;0.129409;,
+ -0.239117;0.965926;0.099045;,
+ -0.249999;0.965926;0.066987;,
+ -0.256604;0.965926;0.033783;,
+ -0.258818;0.965926;-0.000000;,
+ -0.256604;0.965926;-0.033783;,
+ -0.249999;0.965926;-0.066987;,
+ -0.239117;0.965926;-0.099045;,
+ -0.224143;0.965926;-0.129409;,
+ -0.205334;0.965926;-0.157558;,
+ -0.183012;0.965926;-0.183012;,
+ -0.157558;0.965926;-0.205334;,
+ -0.129409;0.965926;-0.224143;,
+ -0.099045;0.965926;-0.239117;,
+ -0.066987;0.965926;-0.249999;,
+ -0.033783;0.965926;-0.256604;,
+ 0.000000;0.965926;-0.258818;,
+ 0.033783;0.965926;-0.256604;,
+ 0.066987;0.965926;-0.249999;,
+ 0.099045;0.965926;-0.239117;,
+ 0.129409;0.965926;-0.224143;,
+ 0.157558;0.965926;-0.205334;,
+ 0.183012;0.965926;-0.183012;,
+ 0.205334;0.965926;-0.157558;,
+ 0.224143;0.965926;-0.129409;,
+ 0.239117;0.965926;-0.099045;,
+ 0.249999;0.965926;-0.066987;,
+ 0.256604;0.965926;-0.033783;,
+ 0.195090;0.980785;-0.000000;,
+ 0.193421;0.980785;0.025464;,
+ 0.188442;0.980785;0.050493;,
+ 0.180239;0.980785;0.074658;,
+ 0.168953;0.980785;0.097545;,
+ 0.154775;0.980785;0.118763;,
+ 0.137949;0.980785;0.137949;,
+ 0.118763;0.980785;0.154775;,
+ 0.097545;0.980785;0.168953;,
+ 0.074658;0.980785;0.180239;,
+ 0.050493;0.980785;0.188442;,
+ 0.025464;0.980785;0.193421;,
+ 0.000000;0.980785;0.195090;,
+ 0.000000;0.980785;0.195090;,
+ -0.025464;0.980785;0.193421;,
+ -0.050493;0.980785;0.188442;,
+ -0.074658;0.980785;0.180239;,
+ -0.097545;0.980785;0.168953;,
+ -0.118763;0.980785;0.154775;,
+ -0.137949;0.980785;0.137949;,
+ -0.154775;0.980785;0.118763;,
+ -0.168953;0.980785;0.097545;,
+ -0.180239;0.980785;0.074658;,
+ -0.188442;0.980785;0.050493;,
+ -0.193421;0.980785;0.025464;,
+ -0.195090;0.980785;-0.000000;,
+ -0.193421;0.980785;-0.025464;,
+ -0.188442;0.980785;-0.050493;,
+ -0.180239;0.980785;-0.074658;,
+ -0.168953;0.980785;-0.097545;,
+ -0.154775;0.980785;-0.118763;,
+ -0.137949;0.980785;-0.137949;,
+ -0.118763;0.980785;-0.154775;,
+ -0.097545;0.980785;-0.168953;,
+ -0.074658;0.980785;-0.180239;,
+ -0.050493;0.980785;-0.188442;,
+ -0.025464;0.980785;-0.193421;,
+ 0.000000;0.980785;-0.195090;,
+ 0.025464;0.980785;-0.193421;,
+ 0.050493;0.980785;-0.188442;,
+ 0.074658;0.980785;-0.180239;,
+ 0.097545;0.980785;-0.168953;,
+ 0.118763;0.980785;-0.154775;,
+ 0.137949;0.980785;-0.137949;,
+ 0.154775;0.980785;-0.118763;,
+ 0.168953;0.980785;-0.097545;,
+ 0.180239;0.980785;-0.074658;,
+ 0.188442;0.980785;-0.050493;,
+ 0.193421;0.980785;-0.025464;,
+ 0.130526;0.991445;-0.000000;,
+ 0.129409;0.991445;0.017037;,
+ 0.126078;0.991445;0.033783;,
+ 0.120590;0.991445;0.049950;,
+ 0.113039;0.991445;0.065263;,
+ 0.103553;0.991445;0.079459;,
+ 0.092296;0.991445;0.092296;,
+ 0.079459;0.991445;0.103553;,
+ 0.065263;0.991445;0.113039;,
+ 0.049950;0.991445;0.120590;,
+ 0.033783;0.991445;0.126078;,
+ 0.017037;0.991445;0.129409;,
+ 0.000000;0.991445;0.130526;,
+ 0.000000;0.991445;0.130526;,
+ -0.017037;0.991445;0.129409;,
+ -0.033783;0.991445;0.126078;,
+ -0.049950;0.991445;0.120590;,
+ -0.065263;0.991445;0.113039;,
+ -0.079459;0.991445;0.103553;,
+ -0.092296;0.991445;0.092296;,
+ -0.103553;0.991445;0.079459;,
+ -0.113039;0.991445;0.065263;,
+ -0.120590;0.991445;0.049950;,
+ -0.126078;0.991445;0.033783;,
+ -0.129409;0.991445;0.017037;,
+ -0.130526;0.991445;-0.000000;,
+ -0.129409;0.991445;-0.017037;,
+ -0.126078;0.991445;-0.033783;,
+ -0.120590;0.991445;-0.049950;,
+ -0.113039;0.991445;-0.065263;,
+ -0.103553;0.991445;-0.079459;,
+ -0.092296;0.991445;-0.092296;,
+ -0.079459;0.991445;-0.103553;,
+ -0.065263;0.991445;-0.113039;,
+ -0.049950;0.991445;-0.120590;,
+ -0.033783;0.991445;-0.126078;,
+ -0.017037;0.991445;-0.129409;,
+ 0.000000;0.991445;-0.130526;,
+ 0.017037;0.991445;-0.129409;,
+ 0.033783;0.991445;-0.126078;,
+ 0.049950;0.991445;-0.120590;,
+ 0.065263;0.991445;-0.113039;,
+ 0.079459;0.991445;-0.103553;,
+ 0.092296;0.991445;-0.092296;,
+ 0.103553;0.991445;-0.079459;,
+ 0.113039;0.991445;-0.065263;,
+ 0.120590;0.991445;-0.049950;,
+ 0.126078;0.991445;-0.033783;,
+ 0.129409;0.991445;-0.017037;,
+ 0.065403;0.997859;0.000000;,
+ 0.064843;0.997859;0.008537;,
+ 0.063174;0.997859;0.016927;,
+ 0.060424;0.997859;0.025029;,
+ 0.056640;0.997859;0.032701;,
+ 0.051887;0.997859;0.039815;,
+ 0.046247;0.997859;0.046247;,
+ 0.039815;0.997859;0.051887;,
+ 0.032701;0.997859;0.056640;,
+ 0.025029;0.997859;0.060424;,
+ 0.016927;0.997859;0.063174;,
+ 0.008537;0.997859;0.064843;,
+ 0.000000;0.997859;0.065403;,
+ 0.000000;0.997859;0.065403;,
+ -0.008537;0.997859;0.064843;,
+ -0.016927;0.997859;0.063174;,
+ -0.025029;0.997859;0.060424;,
+ -0.032701;0.997859;0.056640;,
+ -0.039815;0.997859;0.051887;,
+ -0.046247;0.997859;0.046247;,
+ -0.051887;0.997859;0.039815;,
+ -0.056640;0.997859;0.032701;,
+ -0.060424;0.997859;0.025029;,
+ -0.063174;0.997859;0.016927;,
+ -0.064843;0.997859;0.008537;,
+ -0.065403;0.997859;0.000000;,
+ -0.064843;0.997859;-0.008537;,
+ -0.063174;0.997859;-0.016927;,
+ -0.060424;0.997859;-0.025029;,
+ -0.056640;0.997859;-0.032701;,
+ -0.051887;0.997859;-0.039815;,
+ -0.046247;0.997859;-0.046247;,
+ -0.039815;0.997859;-0.051887;,
+ -0.032701;0.997859;-0.056640;,
+ -0.025029;0.997859;-0.060424;,
+ -0.016927;0.997859;-0.063174;,
+ -0.008537;0.997859;-0.064843;,
+ 0.000000;0.997859;-0.065403;,
+ 0.008537;0.997859;-0.064843;,
+ 0.016927;0.997859;-0.063174;,
+ 0.025029;0.997859;-0.060424;,
+ 0.032701;0.997859;-0.056640;,
+ 0.039815;0.997859;-0.051887;,
+ 0.046247;0.997859;-0.046247;,
+ 0.051887;0.997859;-0.039815;,
+ 0.056640;0.997859;-0.032701;,
+ 0.060424;0.997859;-0.025029;,
+ 0.063174;0.997859;-0.016927;,
+ 0.064843;0.997859;-0.008537;,
+ 0.000000;1.000000;0.000000;,
+ 0.000000;1.000000;0.000000;;
+ 2304;
+ 3;2304,2305,2256;,
+ 3;0,3,4;,
+ 3;0,4,5;,
+ 3;0,5,6;,
+ 3;0,6,7;,
+ 3;0,7,8;,
+ 3;0,8,9;,
+ 3;0,9,10;,
+ 3;0,10,11;,
+ 3;0,11,12;,
+ 3;0,12,13;,
+ 3;0,13,14;,
+ 3;1,15,16;,
+ 3;1,16,17;,
+ 3;1,17,18;,
+ 3;1,18,19;,
+ 3;1,19,20;,
+ 3;1,20,21;,
+ 3;1,21,22;,
+ 3;1,22,23;,
+ 3;1,23,24;,
+ 3;1,24,25;,
+ 3;1,25,26;,
+ 3;1,26,27;,
+ 3;1,27,28;,
+ 3;1,28,29;,
+ 3;1,29,30;,
+ 3;1,30,31;,
+ 3;1,31,32;,
+ 3;1,32,33;,
+ 3;1,33,34;,
+ 3;1,34,35;,
+ 3;1,35,36;,
+ 3;1,36,37;,
+ 3;1,37,38;,
+ 3;1,38,39;,
+ 3;0,39,40;,
+ 3;0,40,41;,
+ 3;0,41,42;,
+ 3;0,42,43;,
+ 3;0,43,44;,
+ 3;0,44,45;,
+ 3;0,45,46;,
+ 3;0,46,47;,
+ 3;0,47,48;,
+ 3;0,48,49;,
+ 3;0,49,50;,
+ 3;0,50,2;,
+ 3;2302,2305,2303;,
+ 3;2301,2305,2302;,
+ 3;2300,2305,2301;,
+ 3;2299,2305,2300;,
+ 3;2298,2305,2299;,
+ 3;2297,2305,2298;,
+ 3;2296,2305,2297;,
+ 3;2295,2305,2296;,
+ 3;2294,2305,2295;,
+ 3;2293,2305,2294;,
+ 3;2293,2292,2305;,
+ 3;2292,2291,2305;,
+ 3;2291,2290,2305;,
+ 3;2290,2289,2305;,
+ 3;2289,2288,2305;,
+ 3;2288,2287,2306;,
+ 3;2287,2286,2306;,
+ 3;2286,2285,2306;,
+ 3;2285,2284,2306;,
+ 3;2284,2283,2306;,
+ 3;2283,2282,2306;,
+ 3;2282,2281,2306;,
+ 3;2281,2280,2306;,
+ 3;2280,2279,2306;,
+ 3;2279,2278,2306;,
+ 3;2278,2277,2306;,
+ 3;2277,2276,2306;,
+ 3;2276,2275,2306;,
+ 3;2275,2274,2306;,
+ 3;2274,2273,2306;,
+ 3;2273,2272,2306;,
+ 3;2272,2271,2306;,
+ 3;2271,2270,2306;,
+ 3;2270,2268,2306;,
+ 3;2267,2305,2269;,
+ 3;2266,2305,2267;,
+ 3;2265,2305,2266;,
+ 3;2264,2305,2265;,
+ 3;2263,2305,2264;,
+ 3;2262,2305,2263;,
+ 3;2261,2305,2262;,
+ 3;2260,2305,2261;,
+ 3;2259,2305,2260;,
+ 3;2258,2305,2259;,
+ 3;2257,2305,2258;,
+ 3;2256,2305,2257;,
+ 3;0,2,3;,
+ 3;2303,2305,2304;,
+ 4;321,320,369,370;,
+ 4;52,101,102,53;,
+ 4;53,102,103,54;,
+ 4;54,103,104,55;,
+ 4;55,104,105,56;,
+ 4;56,105,106,57;,
+ 4;57,106,107,58;,
+ 4;58,107,108,59;,
+ 4;59,108,109,60;,
+ 4;60,109,110,61;,
+ 4;61,110,111,62;,
+ 4;62,111,112,63;,
+ 4;65,64,113,114;,
+ 4;66,65,114,115;,
+ 4;67,66,115,116;,
+ 4;68,67,116,117;,
+ 4;69,68,117,118;,
+ 4;70,69,118,119;,
+ 4;71,70,119,120;,
+ 4;72,71,120,121;,
+ 4;73,72,121,122;,
+ 4;74,73,122,123;,
+ 4;75,74,123,124;,
+ 4;76,75,124,125;,
+ 4;77,76,125,126;,
+ 4;78,77,126,127;,
+ 4;79,78,127,128;,
+ 4;80,79,128,129;,
+ 4;81,80,129,130;,
+ 4;82,81,130,131;,
+ 4;83,82,131,132;,
+ 4;84,83,132,133;,
+ 4;85,84,133,134;,
+ 4;86,85,134,135;,
+ 4;87,86,135,136;,
+ 4;88,87,136,137;,
+ 4;88,137,138,89;,
+ 4;89,138,139,90;,
+ 4;90,139,140,91;,
+ 4;91,140,141,92;,
+ 4;92,141,142,93;,
+ 4;93,142,143,94;,
+ 4;94,143,144,95;,
+ 4;95,144,145,96;,
+ 4;96,145,146,97;,
+ 4;97,146,147,98;,
+ 4;98,147,148,99;,
+ 4;99,148,100,51;,
+ 4;100,149,150,101;,
+ 4;101,150,151,102;,
+ 4;102,151,152,103;,
+ 4;103,152,153,104;,
+ 4;104,153,154,105;,
+ 4;105,154,155,106;,
+ 4;106,155,156,107;,
+ 4;107,156,157,108;,
+ 4;108,157,158,109;,
+ 4;109,158,159,110;,
+ 4;110,159,160,111;,
+ 4;111,160,161,112;,
+ 4;114,113,162,163;,
+ 4;115,114,163,164;,
+ 4;116,115,164,165;,
+ 4;117,116,165,166;,
+ 4;118,117,166,167;,
+ 4;119,118,167,168;,
+ 4;120,119,168,169;,
+ 4;121,120,169,170;,
+ 4;122,121,170,171;,
+ 4;123,122,171,172;,
+ 4;124,123,172,173;,
+ 4;125,124,173,174;,
+ 4;126,125,174,175;,
+ 4;127,126,175,176;,
+ 4;128,127,176,177;,
+ 4;129,128,177,178;,
+ 4;130,129,178,179;,
+ 4;131,130,179,180;,
+ 4;132,131,180,181;,
+ 4;133,132,181,182;,
+ 4;134,133,182,183;,
+ 4;135,134,183,184;,
+ 4;136,135,184,185;,
+ 4;137,136,185,186;,
+ 4;137,186,187,138;,
+ 4;138,187,188,139;,
+ 4;139,188,189,140;,
+ 4;140,189,190,141;,
+ 4;141,190,191,142;,
+ 4;142,191,192,143;,
+ 4;143,192,193,144;,
+ 4;144,193,194,145;,
+ 4;145,194,195,146;,
+ 4;146,195,196,147;,
+ 4;147,196,197,148;,
+ 4;148,197,149,100;,
+ 4;149,198,199,150;,
+ 4;150,199,200,151;,
+ 4;151,200,201,152;,
+ 4;152,201,202,153;,
+ 4;153,202,203,154;,
+ 4;154,203,204,155;,
+ 4;155,204,205,156;,
+ 4;156,205,206,157;,
+ 4;157,206,207,158;,
+ 4;158,207,208,159;,
+ 4;159,208,209,160;,
+ 4;160,209,210,161;,
+ 4;163,162,211,212;,
+ 4;164,163,212,213;,
+ 4;165,164,213,214;,
+ 4;166,165,214,215;,
+ 4;167,166,215,216;,
+ 4;168,167,216,217;,
+ 4;169,168,217,218;,
+ 4;170,169,218,219;,
+ 4;171,170,219,220;,
+ 4;172,171,220,221;,
+ 4;173,172,221,222;,
+ 4;174,173,222,223;,
+ 4;175,174,223,224;,
+ 4;176,175,224,225;,
+ 4;177,176,225,226;,
+ 4;178,177,226,227;,
+ 4;179,178,227,228;,
+ 4;180,179,228,229;,
+ 4;181,180,229,230;,
+ 4;182,181,230,231;,
+ 4;183,182,231,232;,
+ 4;184,183,232,233;,
+ 4;185,184,233,234;,
+ 4;186,185,234,235;,
+ 4;186,235,236,187;,
+ 4;187,236,237,188;,
+ 4;188,237,238,189;,
+ 4;189,238,239,190;,
+ 4;190,239,240,191;,
+ 4;191,240,241,192;,
+ 4;192,241,242,193;,
+ 4;193,242,243,194;,
+ 4;194,243,244,195;,
+ 4;195,244,245,196;,
+ 4;196,245,246,197;,
+ 4;197,246,198,149;,
+ 4;198,247,248,199;,
+ 4;199,248,249,200;,
+ 4;200,249,250,201;,
+ 4;201,250,251,202;,
+ 4;202,251,252,203;,
+ 4;203,252,253,204;,
+ 4;204,253,254,205;,
+ 4;205,254,255,206;,
+ 4;206,255,256,207;,
+ 4;207,256,257,208;,
+ 4;208,257,258,209;,
+ 4;209,258,259,210;,
+ 4;212,211,260,261;,
+ 4;213,212,261,262;,
+ 4;214,213,262,263;,
+ 4;215,214,263,264;,
+ 4;216,215,264,265;,
+ 4;217,216,265,266;,
+ 4;218,217,266,267;,
+ 4;219,218,267,268;,
+ 4;220,219,268,269;,
+ 4;221,220,269,270;,
+ 4;222,221,270,271;,
+ 4;223,222,271,272;,
+ 4;224,223,272,273;,
+ 4;225,224,273,274;,
+ 4;226,225,274,275;,
+ 4;227,226,275,276;,
+ 4;228,227,276,277;,
+ 4;229,228,277,278;,
+ 4;230,229,278,279;,
+ 4;231,230,279,280;,
+ 4;232,231,280,281;,
+ 4;233,232,281,282;,
+ 4;234,233,282,283;,
+ 4;235,234,283,284;,
+ 4;235,284,285,236;,
+ 4;236,285,286,237;,
+ 4;237,286,287,238;,
+ 4;238,287,288,239;,
+ 4;239,288,289,240;,
+ 4;240,289,290,241;,
+ 4;241,290,291,242;,
+ 4;242,291,292,243;,
+ 4;243,292,293,244;,
+ 4;244,293,294,245;,
+ 4;245,294,295,246;,
+ 4;246,295,247,198;,
+ 4;247,296,297,248;,
+ 4;248,297,298,249;,
+ 4;249,298,299,250;,
+ 4;250,299,300,251;,
+ 4;251,300,301,252;,
+ 4;252,301,302,253;,
+ 4;253,302,303,254;,
+ 4;254,303,304,255;,
+ 4;255,304,305,256;,
+ 4;256,305,306,257;,
+ 4;257,306,307,258;,
+ 4;258,307,308,259;,
+ 4;261,260,309,310;,
+ 4;262,261,310,311;,
+ 4;263,262,311,312;,
+ 4;264,263,312,313;,
+ 4;265,264,313,314;,
+ 4;266,265,314,315;,
+ 4;267,266,315,316;,
+ 4;268,267,316,317;,
+ 4;269,268,317,318;,
+ 4;270,269,318,319;,
+ 4;271,270,319,320;,
+ 4;272,271,320,321;,
+ 4;273,272,321,322;,
+ 4;274,273,322,323;,
+ 4;275,274,323,324;,
+ 4;276,275,324,325;,
+ 4;277,276,325,326;,
+ 4;278,277,326,327;,
+ 4;279,278,327,328;,
+ 4;280,279,328,329;,
+ 4;281,280,329,330;,
+ 4;282,281,330,331;,
+ 4;283,282,331,332;,
+ 4;284,283,332,333;,
+ 4;284,333,334,285;,
+ 4;285,334,335,286;,
+ 4;286,335,336,287;,
+ 4;287,336,337,288;,
+ 4;288,337,338,289;,
+ 4;289,338,339,290;,
+ 4;290,339,340,291;,
+ 4;291,340,341,292;,
+ 4;292,341,342,293;,
+ 4;293,342,343,294;,
+ 4;294,343,344,295;,
+ 4;295,344,296,247;,
+ 4;296,345,346,297;,
+ 4;297,346,347,298;,
+ 4;298,347,348,299;,
+ 4;299,348,349,300;,
+ 4;300,349,350,301;,
+ 4;301,350,351,302;,
+ 4;302,351,352,303;,
+ 4;303,352,353,304;,
+ 4;304,353,354,305;,
+ 4;305,354,355,306;,
+ 4;306,355,356,307;,
+ 4;307,356,357,308;,
+ 4;310,309,358,359;,
+ 4;311,310,359,360;,
+ 4;312,311,360,361;,
+ 4;313,312,361,362;,
+ 4;314,313,362,363;,
+ 4;315,314,363,364;,
+ 4;316,315,364,365;,
+ 4;317,316,365,366;,
+ 4;318,317,366,367;,
+ 4;319,318,367,368;,
+ 4;50,99,51,2;,
+ 4;51,100,101,52;,
+ 4;322,321,370,371;,
+ 4;323,322,371,372;,
+ 4;324,323,372,373;,
+ 4;325,324,373,374;,
+ 4;326,325,374,375;,
+ 4;327,326,375,376;,
+ 4;328,327,376,377;,
+ 4;329,328,377,378;,
+ 4;330,329,378,379;,
+ 4;331,330,379,380;,
+ 4;332,331,380,381;,
+ 4;333,332,381,382;,
+ 4;333,382,383,334;,
+ 4;334,383,384,335;,
+ 4;335,384,385,336;,
+ 4;336,385,386,337;,
+ 4;337,386,387,338;,
+ 4;338,387,388,339;,
+ 4;339,388,389,340;,
+ 4;340,389,390,341;,
+ 4;341,390,391,342;,
+ 4;342,391,392,343;,
+ 4;343,392,393,344;,
+ 4;344,393,345,296;,
+ 4;345,394,395,346;,
+ 4;346,395,396,347;,
+ 4;347,396,397,348;,
+ 4;348,397,398,349;,
+ 4;349,398,399,350;,
+ 4;350,399,400,351;,
+ 4;351,400,401,352;,
+ 4;352,401,402,353;,
+ 4;353,402,403,354;,
+ 4;354,403,404,355;,
+ 4;355,404,405,356;,
+ 4;356,405,406,357;,
+ 4;359,358,407,408;,
+ 4;360,359,408,409;,
+ 4;361,360,409,410;,
+ 4;362,361,410,411;,
+ 4;363,362,411,412;,
+ 4;364,363,412,413;,
+ 4;365,364,413,414;,
+ 4;366,365,414,415;,
+ 4;367,366,415,416;,
+ 4;368,367,416,417;,
+ 4;369,368,417,418;,
+ 4;370,369,418,419;,
+ 4;371,370,419,420;,
+ 4;372,371,420,421;,
+ 4;373,372,421,422;,
+ 4;374,373,422,423;,
+ 4;375,374,423,424;,
+ 4;376,375,424,425;,
+ 4;377,376,425,426;,
+ 4;378,377,426,427;,
+ 4;379,378,427,428;,
+ 4;380,379,428,429;,
+ 4;381,380,429,430;,
+ 4;382,381,430,431;,
+ 4;382,431,432,383;,
+ 4;383,432,433,384;,
+ 4;384,433,434,385;,
+ 4;385,434,435,386;,
+ 4;386,435,436,387;,
+ 4;387,436,437,388;,
+ 4;388,437,438,389;,
+ 4;389,438,439,390;,
+ 4;390,439,440,391;,
+ 4;391,440,441,392;,
+ 4;392,441,442,393;,
+ 4;393,442,394,345;,
+ 4;394,443,444,395;,
+ 4;395,444,445,396;,
+ 4;396,445,446,397;,
+ 4;397,446,447,398;,
+ 4;398,447,448,399;,
+ 4;399,448,449,400;,
+ 4;400,449,450,401;,
+ 4;401,450,451,402;,
+ 4;402,451,452,403;,
+ 4;403,452,453,404;,
+ 4;404,453,454,405;,
+ 4;405,454,455,406;,
+ 4;408,407,456,457;,
+ 4;409,408,457,458;,
+ 4;410,409,458,459;,
+ 4;411,410,459,460;,
+ 4;412,411,460,461;,
+ 4;413,412,461,462;,
+ 4;414,413,462,463;,
+ 4;415,414,463,464;,
+ 4;416,415,464,465;,
+ 4;417,416,465,466;,
+ 4;418,417,466,467;,
+ 4;419,418,467,468;,
+ 4;420,419,468,469;,
+ 4;421,420,469,470;,
+ 4;422,421,470,471;,
+ 4;423,422,471,472;,
+ 4;424,423,472,473;,
+ 4;425,424,473,474;,
+ 4;426,425,474,475;,
+ 4;427,426,475,476;,
+ 4;428,427,476,477;,
+ 4;429,428,477,478;,
+ 4;430,429,478,479;,
+ 4;431,430,479,480;,
+ 4;431,480,481,432;,
+ 4;432,481,482,433;,
+ 4;433,482,483,434;,
+ 4;434,483,484,435;,
+ 4;435,484,485,436;,
+ 4;436,485,486,437;,
+ 4;437,486,487,438;,
+ 4;438,487,488,439;,
+ 4;439,488,489,440;,
+ 4;440,489,490,441;,
+ 4;441,490,491,442;,
+ 4;442,491,443,394;,
+ 4;443,492,493,444;,
+ 4;444,493,494,445;,
+ 4;445,494,495,446;,
+ 4;446,495,496,447;,
+ 4;447,496,497,448;,
+ 4;448,497,498,449;,
+ 4;449,498,499,450;,
+ 4;450,499,500,451;,
+ 4;451,500,501,452;,
+ 4;452,501,502,453;,
+ 4;453,502,503,454;,
+ 4;454,503,504,455;,
+ 4;457,456,505,506;,
+ 4;458,457,506,507;,
+ 4;459,458,507,508;,
+ 4;460,459,508,509;,
+ 4;461,460,509,510;,
+ 4;462,461,510,511;,
+ 4;463,462,511,512;,
+ 4;464,463,512,513;,
+ 4;465,464,513,514;,
+ 4;466,465,514,515;,
+ 4;467,466,515,516;,
+ 4;468,467,516,517;,
+ 4;469,468,517,518;,
+ 4;470,469,518,519;,
+ 4;471,470,519,520;,
+ 4;472,471,520,521;,
+ 4;473,472,521,522;,
+ 4;474,473,522,523;,
+ 4;475,474,523,524;,
+ 4;476,475,524,525;,
+ 4;477,476,525,526;,
+ 4;478,477,526,527;,
+ 4;479,478,527,528;,
+ 4;480,479,528,529;,
+ 4;480,529,530,481;,
+ 4;481,530,531,482;,
+ 4;482,531,532,483;,
+ 4;483,532,533,484;,
+ 4;484,533,534,485;,
+ 4;485,534,535,486;,
+ 4;486,535,536,487;,
+ 4;487,536,537,488;,
+ 4;488,537,538,489;,
+ 4;489,538,539,490;,
+ 4;490,539,540,491;,
+ 4;491,540,492,443;,
+ 4;492,541,542,493;,
+ 4;493,542,543,494;,
+ 4;494,543,544,495;,
+ 4;495,544,545,496;,
+ 4;496,545,546,497;,
+ 4;497,546,547,498;,
+ 4;498,547,548,499;,
+ 4;499,548,549,500;,
+ 4;500,549,550,501;,
+ 4;501,550,551,502;,
+ 4;502,551,552,503;,
+ 4;503,552,553,504;,
+ 4;506,505,554,555;,
+ 4;507,506,555,556;,
+ 4;508,507,556,557;,
+ 4;509,508,557,558;,
+ 4;510,509,558,559;,
+ 4;511,510,559,560;,
+ 4;512,511,560,561;,
+ 4;513,512,561,562;,
+ 4;514,513,562,563;,
+ 4;515,514,563,564;,
+ 4;516,515,564,565;,
+ 4;517,516,565,566;,
+ 4;518,517,566,567;,
+ 4;519,518,567,568;,
+ 4;520,519,568,569;,
+ 4;521,520,569,570;,
+ 4;522,521,570,571;,
+ 4;523,522,571,572;,
+ 4;524,523,572,573;,
+ 4;525,524,573,574;,
+ 4;526,525,574,575;,
+ 4;527,526,575,576;,
+ 4;528,527,576,577;,
+ 4;529,528,577,578;,
+ 4;529,578,579,530;,
+ 4;530,579,580,531;,
+ 4;531,580,581,532;,
+ 4;532,581,582,533;,
+ 4;533,582,583,534;,
+ 4;534,583,584,535;,
+ 4;535,584,585,536;,
+ 4;536,585,586,537;,
+ 4;537,586,587,538;,
+ 4;538,587,588,539;,
+ 4;539,588,589,540;,
+ 4;540,589,541,492;,
+ 4;541,590,591,542;,
+ 4;542,591,592,543;,
+ 4;543,592,593,544;,
+ 4;544,593,594,545;,
+ 4;545,594,595,546;,
+ 4;546,595,596,547;,
+ 4;547,596,597,548;,
+ 4;548,597,598,549;,
+ 4;549,598,599,550;,
+ 4;550,599,600,551;,
+ 4;551,600,601,552;,
+ 4;552,601,602,553;,
+ 4;555,554,603,604;,
+ 4;556,555,604,605;,
+ 4;557,556,605,606;,
+ 4;558,557,606,607;,
+ 4;559,558,607,608;,
+ 4;560,559,608,609;,
+ 4;561,560,609,610;,
+ 4;562,561,610,611;,
+ 4;563,562,611,612;,
+ 4;564,563,612,613;,
+ 4;565,564,613,614;,
+ 4;566,565,614,615;,
+ 4;567,566,615,616;,
+ 4;568,567,616,617;,
+ 4;569,568,617,618;,
+ 4;570,569,618,619;,
+ 4;571,570,619,620;,
+ 4;572,571,620,621;,
+ 4;573,572,621,622;,
+ 4;574,573,622,623;,
+ 4;575,574,623,624;,
+ 4;576,575,624,625;,
+ 4;577,576,625,626;,
+ 4;578,577,626,627;,
+ 4;578,627,628,579;,
+ 4;579,628,629,580;,
+ 4;580,629,630,581;,
+ 4;581,630,631,582;,
+ 4;582,631,632,583;,
+ 4;583,632,633,584;,
+ 4;584,633,634,585;,
+ 4;585,634,635,586;,
+ 4;586,635,636,587;,
+ 4;587,636,637,588;,
+ 4;320,319,368,369;,
+ 4;588,637,638,589;,
+ 4;590,639,640,591;,
+ 4;591,640,641,592;,
+ 4;592,641,642,593;,
+ 4;593,642,643,594;,
+ 4;594,643,644,595;,
+ 4;595,644,645,596;,
+ 4;596,645,646,597;,
+ 4;597,646,647,598;,
+ 4;598,647,648,599;,
+ 4;599,648,649,600;,
+ 4;600,649,650,601;,
+ 4;601,650,651,602;,
+ 4;604,603,652,653;,
+ 4;605,604,653,654;,
+ 4;606,605,654,655;,
+ 4;607,606,655,656;,
+ 4;608,607,656,657;,
+ 4;609,608,657,658;,
+ 4;610,609,658,659;,
+ 4;611,610,659,660;,
+ 4;612,611,660,661;,
+ 4;613,612,661,662;,
+ 4;614,613,662,663;,
+ 4;615,614,663,664;,
+ 4;616,615,664,665;,
+ 4;617,616,665,666;,
+ 4;618,617,666,667;,
+ 4;619,618,667,668;,
+ 4;620,619,668,669;,
+ 4;621,620,669,670;,
+ 4;622,621,670,671;,
+ 4;623,622,671,672;,
+ 4;624,623,672,673;,
+ 4;625,624,673,674;,
+ 4;626,625,674,675;,
+ 4;627,626,675,676;,
+ 4;627,676,677,628;,
+ 4;628,677,678,629;,
+ 4;629,678,679,630;,
+ 4;630,679,680,631;,
+ 4;631,680,681,632;,
+ 4;632,681,682,633;,
+ 4;633,682,683,634;,
+ 4;634,683,684,635;,
+ 4;635,684,685,636;,
+ 4;636,685,686,637;,
+ 4;637,686,687,638;,
+ 4;638,687,639,590;,
+ 4;639,688,689,640;,
+ 4;640,689,690,641;,
+ 4;641,690,691,642;,
+ 4;642,691,692,643;,
+ 4;643,692,693,644;,
+ 4;644,693,694,645;,
+ 4;645,694,695,646;,
+ 4;646,695,696,647;,
+ 4;647,696,697,648;,
+ 4;648,697,698,649;,
+ 4;649,698,699,650;,
+ 4;650,699,700,651;,
+ 4;653,652,701,702;,
+ 4;654,653,702,703;,
+ 4;655,654,703,704;,
+ 4;656,655,704,705;,
+ 4;657,656,705,706;,
+ 4;658,657,706,707;,
+ 4;659,658,707,708;,
+ 4;660,659,708,709;,
+ 4;661,660,709,710;,
+ 4;662,661,710,711;,
+ 4;663,662,711,712;,
+ 4;664,663,712,713;,
+ 4;665,664,713,714;,
+ 4;666,665,714,715;,
+ 4;667,666,715,716;,
+ 4;668,667,716,717;,
+ 4;669,668,717,718;,
+ 4;670,669,718,719;,
+ 4;671,670,719,720;,
+ 4;672,671,720,721;,
+ 4;673,672,721,722;,
+ 4;674,673,722,723;,
+ 4;675,674,723,724;,
+ 4;676,675,724,725;,
+ 4;676,725,726,677;,
+ 4;677,726,727,678;,
+ 4;678,727,728,679;,
+ 4;679,728,729,680;,
+ 4;680,729,730,681;,
+ 4;681,730,731,682;,
+ 4;682,731,732,683;,
+ 4;683,732,733,684;,
+ 4;684,733,734,685;,
+ 4;685,734,735,686;,
+ 4;686,735,736,687;,
+ 4;687,736,688,639;,
+ 4;688,737,738,689;,
+ 4;689,738,739,690;,
+ 4;690,739,740,691;,
+ 4;691,740,741,692;,
+ 4;692,741,742,693;,
+ 4;693,742,743,694;,
+ 4;694,743,744,695;,
+ 4;695,744,745,696;,
+ 4;696,745,746,697;,
+ 4;697,746,747,698;,
+ 4;698,747,748,699;,
+ 4;699,748,749,700;,
+ 4;702,701,750,751;,
+ 4;703,702,751,752;,
+ 4;704,703,752,753;,
+ 4;705,704,753,754;,
+ 4;706,705,754,755;,
+ 4;707,706,755,756;,
+ 4;708,707,756,757;,
+ 4;709,708,757,758;,
+ 4;710,709,758,759;,
+ 4;711,710,759,760;,
+ 4;712,711,760,761;,
+ 4;713,712,761,762;,
+ 4;714,713,762,763;,
+ 4;715,714,763,764;,
+ 4;716,715,764,765;,
+ 4;717,716,765,766;,
+ 4;718,717,766,767;,
+ 4;719,718,767,768;,
+ 4;720,719,768,769;,
+ 4;721,720,769,770;,
+ 4;722,721,770,771;,
+ 4;723,722,771,772;,
+ 4;724,723,772,773;,
+ 4;725,724,773,774;,
+ 4;725,774,775,726;,
+ 4;726,775,776,727;,
+ 4;727,776,777,728;,
+ 4;728,777,778,729;,
+ 4;729,778,779,730;,
+ 4;730,779,780,731;,
+ 4;731,780,781,732;,
+ 4;732,781,782,733;,
+ 4;733,782,783,734;,
+ 4;734,783,784,735;,
+ 4;735,784,785,736;,
+ 4;736,785,737,688;,
+ 4;737,786,787,738;,
+ 4;738,787,788,739;,
+ 4;739,788,789,740;,
+ 4;740,789,790,741;,
+ 4;741,790,791,742;,
+ 4;742,791,792,743;,
+ 4;743,792,793,744;,
+ 4;744,793,794,745;,
+ 4;745,794,795,746;,
+ 4;746,795,796,747;,
+ 4;747,796,797,748;,
+ 4;748,797,798,749;,
+ 4;751,750,799,800;,
+ 4;752,751,800,801;,
+ 4;753,752,801,802;,
+ 4;754,753,802,803;,
+ 4;755,754,803,804;,
+ 4;756,755,804,805;,
+ 4;757,756,805,806;,
+ 4;758,757,806,807;,
+ 4;759,758,807,808;,
+ 4;760,759,808,809;,
+ 4;761,760,809,810;,
+ 4;762,761,810,811;,
+ 4;763,762,811,812;,
+ 4;764,763,812,813;,
+ 4;765,764,813,814;,
+ 4;766,765,814,815;,
+ 4;767,766,815,816;,
+ 4;768,767,816,817;,
+ 4;769,768,817,818;,
+ 4;770,769,818,819;,
+ 4;771,770,819,820;,
+ 4;772,771,820,821;,
+ 4;773,772,821,822;,
+ 4;774,773,822,823;,
+ 4;774,823,824,775;,
+ 4;775,824,825,776;,
+ 4;776,825,826,777;,
+ 4;777,826,827,778;,
+ 4;778,827,828,779;,
+ 4;779,828,829,780;,
+ 4;780,829,830,781;,
+ 4;781,830,831,782;,
+ 4;782,831,832,783;,
+ 4;783,832,833,784;,
+ 4;784,833,834,785;,
+ 4;785,834,786,737;,
+ 4;786,835,836,787;,
+ 4;787,836,837,788;,
+ 4;788,837,838,789;,
+ 4;789,838,839,790;,
+ 4;790,839,840,791;,
+ 4;791,840,841,792;,
+ 4;792,841,842,793;,
+ 4;793,842,843,794;,
+ 4;794,843,844,795;,
+ 4;795,844,845,796;,
+ 4;796,845,846,797;,
+ 4;797,846,847,798;,
+ 4;800,799,848,849;,
+ 4;801,800,849,850;,
+ 4;802,801,850,851;,
+ 4;803,802,851,852;,
+ 4;804,803,852,853;,
+ 4;805,804,853,854;,
+ 4;806,805,854,855;,
+ 4;807,806,855,856;,
+ 4;808,807,856,857;,
+ 4;809,808,857,858;,
+ 4;810,809,858,859;,
+ 4;811,810,859,860;,
+ 4;812,811,860,861;,
+ 4;813,812,861,862;,
+ 4;814,813,862,863;,
+ 4;815,814,863,864;,
+ 4;816,815,864,865;,
+ 4;817,816,865,866;,
+ 4;818,817,866,867;,
+ 4;819,818,867,868;,
+ 4;820,819,868,869;,
+ 4;821,820,869,870;,
+ 4;822,821,870,871;,
+ 4;823,822,871,872;,
+ 4;823,872,873,824;,
+ 4;824,873,874,825;,
+ 4;825,874,875,826;,
+ 4;826,875,876,827;,
+ 4;827,876,877,828;,
+ 4;828,877,878,829;,
+ 4;829,878,879,830;,
+ 4;830,879,880,831;,
+ 4;831,880,881,832;,
+ 4;832,881,882,833;,
+ 4;833,882,883,834;,
+ 4;834,883,835,786;,
+ 4;835,884,885,836;,
+ 4;836,885,886,837;,
+ 4;837,886,887,838;,
+ 4;838,887,888,839;,
+ 4;839,888,889,840;,
+ 4;840,889,890,841;,
+ 4;841,890,891,842;,
+ 4;842,891,892,843;,
+ 4;843,892,893,844;,
+ 4;844,893,894,845;,
+ 4;845,894,895,846;,
+ 4;846,895,896,847;,
+ 4;849,848,897,898;,
+ 4;850,849,898,899;,
+ 4;851,850,899,900;,
+ 4;852,851,900,901;,
+ 4;853,852,901,902;,
+ 4;854,853,902,903;,
+ 4;855,854,903,904;,
+ 4;856,855,904,905;,
+ 4;857,856,905,906;,
+ 4;858,857,906,907;,
+ 4;859,858,907,908;,
+ 4;860,859,908,909;,
+ 4;861,860,909,910;,
+ 4;862,861,910,911;,
+ 4;863,862,911,912;,
+ 4;864,863,912,913;,
+ 4;865,864,913,914;,
+ 4;866,865,914,915;,
+ 4;867,866,915,916;,
+ 4;868,867,916,917;,
+ 4;869,868,917,918;,
+ 4;870,869,918,919;,
+ 4;871,870,919,920;,
+ 4;872,871,920,921;,
+ 4;872,921,922,873;,
+ 4;873,922,923,874;,
+ 4;874,923,924,875;,
+ 4;875,924,925,876;,
+ 4;876,925,926,877;,
+ 4;877,926,927,878;,
+ 4;878,927,928,879;,
+ 4;879,928,929,880;,
+ 4;880,929,930,881;,
+ 4;881,930,931,882;,
+ 4;882,931,932,883;,
+ 4;883,932,884,835;,
+ 4;884,933,934,885;,
+ 4;885,934,935,886;,
+ 4;886,935,936,887;,
+ 4;887,936,937,888;,
+ 4;888,937,938,889;,
+ 4;889,938,939,890;,
+ 4;890,939,940,891;,
+ 4;891,940,941,892;,
+ 4;892,941,942,893;,
+ 4;893,942,943,894;,
+ 4;894,943,944,895;,
+ 4;895,944,945,896;,
+ 4;898,897,946,947;,
+ 4;899,898,947,948;,
+ 4;900,899,948,949;,
+ 4;901,900,949,950;,
+ 4;902,901,950,951;,
+ 4;903,902,951,952;,
+ 4;904,903,952,953;,
+ 4;905,904,953,954;,
+ 4;906,905,954,955;,
+ 4;907,906,955,956;,
+ 4;908,907,956,957;,
+ 4;909,908,957,958;,
+ 4;910,909,958,959;,
+ 4;911,910,959,960;,
+ 4;912,911,960,961;,
+ 4;913,912,961,962;,
+ 4;914,913,962,963;,
+ 4;915,914,963,964;,
+ 4;916,915,964,965;,
+ 4;917,916,965,966;,
+ 4;918,917,966,967;,
+ 4;919,918,967,968;,
+ 4;920,919,968,969;,
+ 4;921,920,969,970;,
+ 4;921,970,971,922;,
+ 4;922,971,972,923;,
+ 4;923,972,973,924;,
+ 4;924,973,974,925;,
+ 4;925,974,975,926;,
+ 4;926,975,976,927;,
+ 4;927,976,977,928;,
+ 4;928,977,978,929;,
+ 4;929,978,979,930;,
+ 4;930,979,980,931;,
+ 4;931,980,981,932;,
+ 4;932,981,933,884;,
+ 4;933,982,983,934;,
+ 4;934,983,984,935;,
+ 4;935,984,985,936;,
+ 4;936,985,986,937;,
+ 4;937,986,987,938;,
+ 4;938,987,988,939;,
+ 4;939,988,989,940;,
+ 4;940,989,990,941;,
+ 4;941,990,991,942;,
+ 4;942,991,992,943;,
+ 4;943,992,993,944;,
+ 4;944,993,994,945;,
+ 4;947,946,995,996;,
+ 4;948,947,996,997;,
+ 4;949,948,997,998;,
+ 4;950,949,998,999;,
+ 4;951,950,999,1000;,
+ 4;952,951,1000,1001;,
+ 4;953,952,1001,1002;,
+ 4;954,953,1002,1003;,
+ 4;955,954,1003,1004;,
+ 4;956,955,1004,1005;,
+ 4;957,956,1005,1006;,
+ 4;958,957,1006,1007;,
+ 4;959,958,1007,1008;,
+ 4;960,959,1008,1009;,
+ 4;961,960,1009,1010;,
+ 4;962,961,1010,1011;,
+ 4;963,962,1011,1012;,
+ 4;964,963,1012,1013;,
+ 4;965,964,1013,1014;,
+ 4;966,965,1014,1015;,
+ 4;967,966,1015,1016;,
+ 4;968,967,1016,1017;,
+ 4;969,968,1017,1018;,
+ 4;970,969,1018,1019;,
+ 4;970,1019,1020,971;,
+ 4;971,1020,1021,972;,
+ 4;972,1021,1022,973;,
+ 4;973,1022,1023,974;,
+ 4;974,1023,1024,975;,
+ 4;975,1024,1025,976;,
+ 4;976,1025,1026,977;,
+ 4;977,1026,1027,978;,
+ 4;978,1027,1028,979;,
+ 4;979,1028,1029,980;,
+ 4;980,1029,1030,981;,
+ 4;981,1030,982,933;,
+ 4;982,1031,1032,983;,
+ 4;983,1032,1033,984;,
+ 4;984,1033,1034,985;,
+ 4;985,1034,1035,986;,
+ 4;986,1035,1036,987;,
+ 4;987,1036,1037,988;,
+ 4;988,1037,1038,989;,
+ 4;989,1038,1039,990;,
+ 4;990,1039,1040,991;,
+ 4;991,1040,1041,992;,
+ 4;992,1041,1042,993;,
+ 4;993,1042,1043,994;,
+ 4;996,995,1044,1045;,
+ 4;997,996,1045,1046;,
+ 4;998,997,1046,1047;,
+ 4;999,998,1047,1048;,
+ 4;1000,999,1048,1049;,
+ 4;1001,1000,1049,1050;,
+ 4;1002,1001,1050,1051;,
+ 4;1003,1002,1051,1052;,
+ 4;1004,1003,1052,1053;,
+ 4;1005,1004,1053,1054;,
+ 4;1006,1005,1054,1055;,
+ 4;1007,1006,1055,1056;,
+ 4;1008,1007,1056,1057;,
+ 4;1009,1008,1057,1058;,
+ 4;1010,1009,1058,1059;,
+ 4;1011,1010,1059,1060;,
+ 4;1012,1011,1060,1061;,
+ 4;1013,1012,1061,1062;,
+ 4;1014,1013,1062,1063;,
+ 4;1015,1014,1063,1064;,
+ 4;1016,1015,1064,1065;,
+ 4;1017,1016,1065,1066;,
+ 4;1018,1017,1066,1067;,
+ 4;1019,1018,1067,1068;,
+ 4;1019,1068,1069,1020;,
+ 4;1020,1069,1070,1021;,
+ 4;1021,1070,1071,1022;,
+ 4;1022,1071,1072,1023;,
+ 4;1023,1072,1073,1024;,
+ 4;1024,1073,1074,1025;,
+ 4;1025,1074,1075,1026;,
+ 4;1026,1075,1076,1027;,
+ 4;1027,1076,1077,1028;,
+ 4;1028,1077,1078,1029;,
+ 4;1029,1078,1079,1030;,
+ 4;1030,1079,1031,982;,
+ 4;1031,1080,1081,1032;,
+ 4;1032,1081,1082,1033;,
+ 4;1033,1082,1083,1034;,
+ 4;1034,1083,1084,1035;,
+ 4;1035,1084,1085,1036;,
+ 4;1036,1085,1086,1037;,
+ 4;1037,1086,1087,1038;,
+ 4;1038,1087,1088,1039;,
+ 4;1039,1088,1089,1040;,
+ 4;1040,1089,1090,1041;,
+ 4;1041,1090,1091,1042;,
+ 4;1042,1091,1092,1043;,
+ 4;1045,1044,1093,1094;,
+ 4;1046,1045,1094,1095;,
+ 4;1047,1046,1095,1096;,
+ 4;1048,1047,1096,1097;,
+ 4;1049,1048,1097,1098;,
+ 4;1050,1049,1098,1099;,
+ 4;1051,1050,1099,1100;,
+ 4;1052,1051,1100,1101;,
+ 4;1053,1052,1101,1102;,
+ 4;1054,1053,1102,1103;,
+ 4;1055,1054,1103,1104;,
+ 4;1056,1055,1104,1105;,
+ 4;1057,1056,1105,1106;,
+ 4;1058,1057,1106,1107;,
+ 4;1059,1058,1107,1108;,
+ 4;1060,1059,1108,1109;,
+ 4;1061,1060,1109,1110;,
+ 4;1062,1061,1110,1111;,
+ 4;1063,1062,1111,1112;,
+ 4;1064,1063,1112,1113;,
+ 4;1065,1064,1113,1114;,
+ 4;1066,1065,1114,1115;,
+ 4;1067,1066,1115,1116;,
+ 4;1068,1067,1116,1117;,
+ 4;1068,1117,1118,1069;,
+ 4;1069,1118,1119,1070;,
+ 4;1070,1119,1120,1071;,
+ 4;1071,1120,1121,1072;,
+ 4;1072,1121,1122,1073;,
+ 4;1073,1122,1123,1074;,
+ 4;1074,1123,1124,1075;,
+ 4;1075,1124,1125,1076;,
+ 4;1076,1125,1126,1077;,
+ 4;1077,1126,1127,1078;,
+ 4;1078,1127,1128,1079;,
+ 4;1079,1128,1080,1031;,
+ 4;1080,1129,1130,1081;,
+ 4;1081,1130,1131,1082;,
+ 4;1082,1131,1132,1083;,
+ 4;1083,1132,1133,1084;,
+ 4;1084,1133,1134,1085;,
+ 4;1085,1134,1135,1086;,
+ 4;1086,1135,1136,1087;,
+ 4;1087,1136,1137,1088;,
+ 4;1088,1137,1138,1089;,
+ 4;1089,1138,1139,1090;,
+ 4;1090,1139,1140,1091;,
+ 4;1091,1140,1141,1092;,
+ 4;1094,1093,1142,1143;,
+ 4;1095,1094,1143,1144;,
+ 4;1096,1095,1144,1145;,
+ 4;1097,1096,1145,1146;,
+ 4;1098,1097,1146,1147;,
+ 4;1099,1098,1147,1148;,
+ 4;1100,1099,1148,1149;,
+ 4;1101,1100,1149,1150;,
+ 4;1102,1101,1150,1151;,
+ 4;1103,1102,1151,1152;,
+ 4;1104,1103,1152,1153;,
+ 4;1105,1104,1153,1154;,
+ 4;1106,1105,1154,1155;,
+ 4;1107,1106,1155,1156;,
+ 4;1108,1107,1156,1157;,
+ 4;1109,1108,1157,1158;,
+ 4;1110,1109,1158,1159;,
+ 4;1111,1110,1159,1160;,
+ 4;1112,1111,1160,1161;,
+ 4;1113,1112,1161,1162;,
+ 4;1114,1113,1162,1163;,
+ 4;1115,1114,1163,1164;,
+ 4;1116,1115,1164,1165;,
+ 4;1117,1116,1165,1166;,
+ 4;1117,1166,1167,1118;,
+ 4;1118,1167,1168,1119;,
+ 4;1119,1168,1169,1120;,
+ 4;1120,1169,1170,1121;,
+ 4;1121,1170,1171,1122;,
+ 4;1122,1171,1172,1123;,
+ 4;1123,1172,1173,1124;,
+ 4;1124,1173,1174,1125;,
+ 4;1125,1174,1175,1126;,
+ 4;1126,1175,1176,1127;,
+ 4;1127,1176,1177,1128;,
+ 4;589,638,590,541;,
+ 4;47,96,97,48;,
+ 4;1130,1179,1180,1131;,
+ 4;1131,1180,1181,1132;,
+ 4;1132,1181,1182,1133;,
+ 4;1133,1182,1183,1134;,
+ 4;1134,1183,1184,1135;,
+ 4;1135,1184,1185,1136;,
+ 4;1136,1185,1186,1137;,
+ 4;1137,1186,1187,1138;,
+ 4;1138,1187,1188,1139;,
+ 4;1139,1188,1189,1140;,
+ 4;1140,1189,1190,1141;,
+ 4;1143,1142,1191,1192;,
+ 4;1144,1143,1192,1193;,
+ 4;1145,1144,1193,1194;,
+ 4;1146,1145,1194,1195;,
+ 4;1147,1146,1195,1196;,
+ 4;1148,1147,1196,1197;,
+ 4;1149,1148,1197,1198;,
+ 4;1150,1149,1198,1199;,
+ 4;1151,1150,1199,1200;,
+ 4;1152,1151,1200,1201;,
+ 4;48,97,98,49;,
+ 4;49,98,99,50;,
+ 4;1155,1154,1203,1204;,
+ 4;1156,1155,1204,1205;,
+ 4;1157,1156,1205,1206;,
+ 4;1158,1157,1206,1207;,
+ 4;1159,1158,1207,1208;,
+ 4;1160,1159,1208,1209;,
+ 4;1161,1160,1209,1210;,
+ 4;1162,1161,1210,1211;,
+ 4;1163,1162,1211,1212;,
+ 4;1164,1163,1212,1213;,
+ 4;1165,1164,1213,1214;,
+ 4;1166,1165,1214,1215;,
+ 4;1166,1215,1216,1167;,
+ 4;1167,1216,1217,1168;,
+ 4;1168,1217,1218,1169;,
+ 4;1169,1218,1219,1170;,
+ 4;1170,1219,1220,1171;,
+ 4;1171,1220,1221,1172;,
+ 4;1172,1221,1222,1173;,
+ 4;1173,1222,1223,1174;,
+ 4;1174,1223,1224,1175;,
+ 4;1175,1224,1225,1176;,
+ 4;1176,1225,1226,1177;,
+ 4;1177,1226,1178,1129;,
+ 4;1178,1227,1228,1179;,
+ 4;1179,1228,1229,1180;,
+ 4;1180,1229,1230,1181;,
+ 4;1181,1230,1231,1182;,
+ 4;1182,1231,1232,1183;,
+ 4;1183,1232,1233,1184;,
+ 4;1184,1233,1234,1185;,
+ 4;1185,1234,1235,1186;,
+ 4;1186,1235,1236,1187;,
+ 4;1187,1236,1237,1188;,
+ 4;1188,1237,1238,1189;,
+ 4;1189,1238,1239,1190;,
+ 4;1192,1191,1240,1241;,
+ 4;1193,1192,1241,1242;,
+ 4;1194,1193,1242,1243;,
+ 4;1195,1194,1243,1244;,
+ 4;1196,1195,1244,1245;,
+ 4;1197,1196,1245,1246;,
+ 4;1198,1197,1246,1247;,
+ 4;1199,1198,1247,1248;,
+ 4;1200,1199,1248,1249;,
+ 4;1201,1200,1249,1250;,
+ 4;1202,1201,1250,1251;,
+ 4;1203,1202,1251,1252;,
+ 4;1204,1203,1252,1253;,
+ 4;1205,1204,1253,1254;,
+ 4;1206,1205,1254,1255;,
+ 4;1207,1206,1255,1256;,
+ 4;1208,1207,1256,1257;,
+ 4;1209,1208,1257,1258;,
+ 4;1210,1209,1258,1259;,
+ 4;1211,1210,1259,1260;,
+ 4;1212,1211,1260,1261;,
+ 4;1213,1212,1261,1262;,
+ 4;1214,1213,1262,1263;,
+ 4;1215,1214,1263,1264;,
+ 4;1215,1264,1265,1216;,
+ 4;1216,1265,1266,1217;,
+ 4;1217,1266,1267,1218;,
+ 4;1218,1267,1268,1219;,
+ 4;1219,1268,1269,1220;,
+ 4;1220,1269,1270,1221;,
+ 4;1221,1270,1271,1222;,
+ 4;1222,1271,1272,1223;,
+ 4;1223,1272,1273,1224;,
+ 4;1224,1273,1274,1225;,
+ 4;1225,1274,1275,1226;,
+ 4;1226,1275,1227,1178;,
+ 4;1227,1276,1277,1228;,
+ 4;1228,1277,1278,1229;,
+ 4;1229,1278,1279,1230;,
+ 4;1230,1279,1280,1231;,
+ 4;1231,1280,1281,1232;,
+ 4;1232,1281,1282,1233;,
+ 4;1233,1282,1283,1234;,
+ 4;1234,1283,1284,1235;,
+ 4;1235,1284,1285,1236;,
+ 4;1236,1285,1286,1237;,
+ 4;1237,1286,1287,1238;,
+ 4;1238,1287,1288,1239;,
+ 4;1241,1240,1289,1290;,
+ 4;1242,1241,1290,1291;,
+ 4;1243,1242,1291,1292;,
+ 4;1244,1243,1292,1293;,
+ 4;1245,1244,1293,1294;,
+ 4;1246,1245,1294,1295;,
+ 4;1247,1246,1295,1296;,
+ 4;1248,1247,1296,1297;,
+ 4;1249,1248,1297,1298;,
+ 4;1250,1249,1298,1299;,
+ 4;1251,1250,1299,1300;,
+ 4;1252,1251,1300,1301;,
+ 4;1253,1252,1301,1302;,
+ 4;1254,1253,1302,1303;,
+ 4;1255,1254,1303,1304;,
+ 4;1256,1255,1304,1305;,
+ 4;1257,1256,1305,1306;,
+ 4;1258,1257,1306,1307;,
+ 4;1259,1258,1307,1308;,
+ 4;1260,1259,1308,1309;,
+ 4;1261,1260,1309,1310;,
+ 4;1262,1261,1310,1311;,
+ 4;1263,1262,1311,1312;,
+ 4;1264,1263,1312,1313;,
+ 4;1264,1313,1314,1265;,
+ 4;1265,1314,1315,1266;,
+ 4;1266,1315,1316,1267;,
+ 4;1267,1316,1317,1268;,
+ 4;1268,1317,1318,1269;,
+ 4;1269,1318,1319,1270;,
+ 4;1270,1319,1320,1271;,
+ 4;1271,1320,1321,1272;,
+ 4;1272,1321,1322,1273;,
+ 4;1273,1322,1323,1274;,
+ 4;1274,1323,1324,1275;,
+ 4;1275,1324,1276,1227;,
+ 4;1276,1325,1326,1277;,
+ 4;1277,1326,1327,1278;,
+ 4;1278,1327,1328,1279;,
+ 4;1279,1328,1329,1280;,
+ 4;1280,1329,1330,1281;,
+ 4;1281,1330,1331,1282;,
+ 4;1282,1331,1332,1283;,
+ 4;1283,1332,1333,1284;,
+ 4;1284,1333,1334,1285;,
+ 4;1285,1334,1335,1286;,
+ 4;1286,1335,1336,1287;,
+ 4;1287,1336,1337,1288;,
+ 4;1290,1289,1338,1339;,
+ 4;1291,1290,1339,1340;,
+ 4;1292,1291,1340,1341;,
+ 4;1293,1292,1341,1342;,
+ 4;1294,1293,1342,1343;,
+ 4;1295,1294,1343,1344;,
+ 4;1296,1295,1344,1345;,
+ 4;1297,1296,1345,1346;,
+ 4;1298,1297,1346,1347;,
+ 4;1299,1298,1347,1348;,
+ 4;1300,1299,1348,1349;,
+ 4;1301,1300,1349,1350;,
+ 4;1302,1301,1350,1351;,
+ 4;1303,1302,1351,1352;,
+ 4;1304,1303,1352,1353;,
+ 4;1305,1304,1353,1354;,
+ 4;1306,1305,1354,1355;,
+ 4;1307,1306,1355,1356;,
+ 4;1308,1307,1356,1357;,
+ 4;1309,1308,1357,1358;,
+ 4;1310,1309,1358,1359;,
+ 4;1311,1310,1359,1360;,
+ 4;1312,1311,1360,1361;,
+ 4;1313,1312,1361,1362;,
+ 4;1313,1362,1363,1314;,
+ 4;1314,1363,1364,1315;,
+ 4;1315,1364,1365,1316;,
+ 4;1316,1365,1366,1317;,
+ 4;1317,1366,1367,1318;,
+ 4;1318,1367,1368,1319;,
+ 4;1319,1368,1369,1320;,
+ 4;1320,1369,1370,1321;,
+ 4;1321,1370,1371,1322;,
+ 4;1322,1371,1372,1323;,
+ 4;1323,1372,1373,1324;,
+ 4;1324,1373,1325,1276;,
+ 4;1325,1374,1375,1326;,
+ 4;1326,1375,1376,1327;,
+ 4;1327,1376,1377,1328;,
+ 4;1328,1377,1378,1329;,
+ 4;1329,1378,1379,1330;,
+ 4;1330,1379,1380,1331;,
+ 4;1331,1380,1381,1332;,
+ 4;1332,1381,1382,1333;,
+ 4;1333,1382,1383,1334;,
+ 4;1334,1383,1384,1335;,
+ 4;1335,1384,1385,1336;,
+ 4;1336,1385,1386,1337;,
+ 4;1339,1338,1387,1388;,
+ 4;1340,1339,1388,1389;,
+ 4;1341,1340,1389,1390;,
+ 4;1342,1341,1390,1391;,
+ 4;1343,1342,1391,1392;,
+ 4;1344,1343,1392,1393;,
+ 4;1345,1344,1393,1394;,
+ 4;1346,1345,1394,1395;,
+ 4;1347,1346,1395,1396;,
+ 4;1348,1347,1396,1397;,
+ 4;1349,1348,1397,1398;,
+ 4;1350,1349,1398,1399;,
+ 4;1351,1350,1399,1400;,
+ 4;1352,1351,1400,1401;,
+ 4;1353,1352,1401,1402;,
+ 4;1354,1353,1402,1403;,
+ 4;1355,1354,1403,1404;,
+ 4;1356,1355,1404,1405;,
+ 4;1357,1356,1405,1406;,
+ 4;1358,1357,1406,1407;,
+ 4;1359,1358,1407,1408;,
+ 4;1360,1359,1408,1409;,
+ 4;1361,1360,1409,1410;,
+ 4;1362,1361,1410,1411;,
+ 4;1362,1411,1412,1363;,
+ 4;1363,1412,1413,1364;,
+ 4;1364,1413,1414,1365;,
+ 4;1365,1414,1415,1366;,
+ 4;1366,1415,1416,1367;,
+ 4;1367,1416,1417,1368;,
+ 4;1368,1417,1418,1369;,
+ 4;1369,1418,1419,1370;,
+ 4;1370,1419,1420,1371;,
+ 4;1371,1420,1421,1372;,
+ 4;1372,1421,1422,1373;,
+ 4;1373,1422,1374,1325;,
+ 4;1374,1423,1424,1375;,
+ 4;1375,1424,1425,1376;,
+ 4;1376,1425,1426,1377;,
+ 4;1377,1426,1427,1378;,
+ 4;1378,1427,1428,1379;,
+ 4;1379,1428,1429,1380;,
+ 4;1380,1429,1430,1381;,
+ 4;1381,1430,1431,1382;,
+ 4;1382,1431,1432,1383;,
+ 4;1383,1432,1433,1384;,
+ 4;1384,1433,1434,1385;,
+ 4;1385,1434,1435,1386;,
+ 4;1388,1387,1436,1437;,
+ 4;1389,1388,1437,1438;,
+ 4;1390,1389,1438,1439;,
+ 4;1391,1390,1439,1440;,
+ 4;1392,1391,1440,1441;,
+ 4;1393,1392,1441,1442;,
+ 4;1394,1393,1442,1443;,
+ 4;1395,1394,1443,1444;,
+ 4;1396,1395,1444,1445;,
+ 4;1397,1396,1445,1446;,
+ 4;1398,1397,1446,1447;,
+ 4;1399,1398,1447,1448;,
+ 4;1400,1399,1448,1449;,
+ 4;1401,1400,1449,1450;,
+ 4;1402,1401,1450,1451;,
+ 4;1403,1402,1451,1452;,
+ 4;1404,1403,1452,1453;,
+ 4;1405,1404,1453,1454;,
+ 4;1406,1405,1454,1455;,
+ 4;1407,1406,1455,1456;,
+ 4;1408,1407,1456,1457;,
+ 4;1409,1408,1457,1458;,
+ 4;1410,1409,1458,1459;,
+ 4;1411,1410,1459,1460;,
+ 4;1411,1460,1461,1412;,
+ 4;1412,1461,1462,1413;,
+ 4;1413,1462,1463,1414;,
+ 4;1414,1463,1464,1415;,
+ 4;1415,1464,1465,1416;,
+ 4;1416,1465,1466,1417;,
+ 4;1417,1466,1467,1418;,
+ 4;1418,1467,1468,1419;,
+ 4;1419,1468,1469,1420;,
+ 4;1420,1469,1470,1421;,
+ 4;1421,1470,1471,1422;,
+ 4;1422,1471,1423,1374;,
+ 4;1423,1472,1473,1424;,
+ 4;1424,1473,1474,1425;,
+ 4;1425,1474,1475,1426;,
+ 4;1426,1475,1476,1427;,
+ 4;1427,1476,1477,1428;,
+ 4;1428,1477,1478,1429;,
+ 4;1429,1478,1479,1430;,
+ 4;1430,1479,1480,1431;,
+ 4;1431,1480,1481,1432;,
+ 4;1432,1481,1482,1433;,
+ 4;1433,1482,1483,1434;,
+ 4;1434,1483,1484,1435;,
+ 4;1437,1436,1485,1486;,
+ 4;1438,1437,1486,1487;,
+ 4;1439,1438,1487,1488;,
+ 4;1440,1439,1488,1489;,
+ 4;1441,1440,1489,1490;,
+ 4;1442,1441,1490,1491;,
+ 4;1443,1442,1491,1492;,
+ 4;1444,1443,1492,1493;,
+ 4;1445,1444,1493,1494;,
+ 4;1446,1445,1494,1495;,
+ 4;1447,1446,1495,1496;,
+ 4;1448,1447,1496,1497;,
+ 4;1449,1448,1497,1498;,
+ 4;1450,1449,1498,1499;,
+ 4;1451,1450,1499,1500;,
+ 4;1452,1451,1500,1501;,
+ 4;1453,1452,1501,1502;,
+ 4;1454,1453,1502,1503;,
+ 4;1455,1454,1503,1504;,
+ 4;1456,1455,1504,1505;,
+ 4;1457,1456,1505,1506;,
+ 4;1458,1457,1506,1507;,
+ 4;1459,1458,1507,1508;,
+ 4;1460,1459,1508,1509;,
+ 4;1460,1509,1510,1461;,
+ 4;1461,1510,1511,1462;,
+ 4;1462,1511,1512,1463;,
+ 4;1463,1512,1513,1464;,
+ 4;1464,1513,1514,1465;,
+ 4;1465,1514,1515,1466;,
+ 4;1466,1515,1516,1467;,
+ 4;1467,1516,1517,1468;,
+ 4;1468,1517,1518,1469;,
+ 4;1469,1518,1519,1470;,
+ 4;1470,1519,1520,1471;,
+ 4;1471,1520,1472,1423;,
+ 4;1472,1521,1522,1473;,
+ 4;1473,1522,1523,1474;,
+ 4;1474,1523,1524,1475;,
+ 4;1475,1524,1525,1476;,
+ 4;1476,1525,1526,1477;,
+ 4;1477,1526,1527,1478;,
+ 4;1478,1527,1528,1479;,
+ 4;1479,1528,1529,1480;,
+ 4;1480,1529,1530,1481;,
+ 4;1481,1530,1531,1482;,
+ 4;1482,1531,1532,1483;,
+ 4;1483,1532,1533,1484;,
+ 4;1486,1485,1534,1535;,
+ 4;1487,1486,1535,1536;,
+ 4;1488,1487,1536,1537;,
+ 4;1489,1488,1537,1538;,
+ 4;1490,1489,1538,1539;,
+ 4;1491,1490,1539,1540;,
+ 4;1492,1491,1540,1541;,
+ 4;1493,1492,1541,1542;,
+ 4;1494,1493,1542,1543;,
+ 4;1495,1494,1543,1544;,
+ 4;1496,1495,1544,1545;,
+ 4;1497,1496,1545,1546;,
+ 4;1498,1497,1546,1547;,
+ 4;1499,1498,1547,1548;,
+ 4;1500,1499,1548,1549;,
+ 4;1501,1500,1549,1550;,
+ 4;1502,1501,1550,1551;,
+ 4;1503,1502,1551,1552;,
+ 4;1504,1503,1552,1553;,
+ 4;1505,1504,1553,1554;,
+ 4;1506,1505,1554,1555;,
+ 4;1507,1506,1555,1556;,
+ 4;1508,1507,1556,1557;,
+ 4;1509,1508,1557,1558;,
+ 4;1509,1558,1559,1510;,
+ 4;1510,1559,1560,1511;,
+ 4;1511,1560,1561,1512;,
+ 4;1512,1561,1562,1513;,
+ 4;1513,1562,1563,1514;,
+ 4;1514,1563,1564,1515;,
+ 4;1515,1564,1565,1516;,
+ 4;1516,1565,1566,1517;,
+ 4;1517,1566,1567,1518;,
+ 4;1518,1567,1568,1519;,
+ 4;1519,1568,1569,1520;,
+ 4;1520,1569,1521,1472;,
+ 4;1521,1570,1571,1522;,
+ 4;1522,1571,1572,1523;,
+ 4;1523,1572,1573,1524;,
+ 4;1524,1573,1574,1525;,
+ 4;1525,1574,1575,1526;,
+ 4;1526,1575,1576,1527;,
+ 4;1527,1576,1577,1528;,
+ 4;1528,1577,1578,1529;,
+ 4;1529,1578,1579,1530;,
+ 4;1530,1579,1580,1531;,
+ 4;1531,1580,1581,1532;,
+ 4;1532,1581,1582,1533;,
+ 4;1535,1534,1583,1584;,
+ 4;1536,1535,1584,1585;,
+ 4;1537,1536,1585,1586;,
+ 4;1538,1537,1586,1587;,
+ 4;1539,1538,1587,1588;,
+ 4;1540,1539,1588,1589;,
+ 4;1541,1540,1589,1590;,
+ 4;1542,1541,1590,1591;,
+ 4;1543,1542,1591,1592;,
+ 4;1544,1543,1592,1593;,
+ 4;1545,1544,1593,1594;,
+ 4;1546,1545,1594,1595;,
+ 4;1547,1546,1595,1596;,
+ 4;1548,1547,1596,1597;,
+ 4;1549,1548,1597,1598;,
+ 4;1550,1549,1598,1599;,
+ 4;1551,1550,1599,1600;,
+ 4;1552,1551,1600,1601;,
+ 4;1553,1552,1601,1602;,
+ 4;1554,1553,1602,1603;,
+ 4;1555,1554,1603,1604;,
+ 4;1556,1555,1604,1605;,
+ 4;1557,1556,1605,1606;,
+ 4;1558,1557,1606,1607;,
+ 4;1558,1607,1608,1559;,
+ 4;1559,1608,1609,1560;,
+ 4;1560,1609,1610,1561;,
+ 4;1561,1610,1611,1562;,
+ 4;1562,1611,1612,1563;,
+ 4;1563,1612,1613,1564;,
+ 4;1564,1613,1614,1565;,
+ 4;1565,1614,1615,1566;,
+ 4;1566,1615,1616,1567;,
+ 4;1567,1616,1617,1568;,
+ 4;1568,1617,1618,1569;,
+ 4;1569,1618,1570,1521;,
+ 4;1570,1619,1620,1571;,
+ 4;1571,1620,1621,1572;,
+ 4;1572,1621,1622,1573;,
+ 4;1573,1622,1623,1574;,
+ 4;1574,1623,1624,1575;,
+ 4;1575,1624,1625,1576;,
+ 4;1576,1625,1626,1577;,
+ 4;1577,1626,1627,1578;,
+ 4;1578,1627,1628,1579;,
+ 4;1579,1628,1629,1580;,
+ 4;1580,1629,1630,1581;,
+ 4;1581,1630,1631,1582;,
+ 4;1584,1583,1632,1633;,
+ 4;1585,1584,1633,1634;,
+ 4;1586,1585,1634,1635;,
+ 4;1587,1586,1635,1636;,
+ 4;1588,1587,1636,1637;,
+ 4;1589,1588,1637,1638;,
+ 4;1590,1589,1638,1639;,
+ 4;1591,1590,1639,1640;,
+ 4;1592,1591,1640,1641;,
+ 4;1593,1592,1641,1642;,
+ 4;1594,1593,1642,1643;,
+ 4;1595,1594,1643,1644;,
+ 4;1596,1595,1644,1645;,
+ 4;1597,1596,1645,1646;,
+ 4;1598,1597,1646,1647;,
+ 4;1599,1598,1647,1648;,
+ 4;1600,1599,1648,1649;,
+ 4;1601,1600,1649,1650;,
+ 4;1602,1601,1650,1651;,
+ 4;1603,1602,1651,1652;,
+ 4;1604,1603,1652,1653;,
+ 4;1605,1604,1653,1654;,
+ 4;1606,1605,1654,1655;,
+ 4;1607,1606,1655,1656;,
+ 4;1607,1656,1657,1608;,
+ 4;1608,1657,1658,1609;,
+ 4;1609,1658,1659,1610;,
+ 4;1610,1659,1660,1611;,
+ 4;1611,1660,1661,1612;,
+ 4;1612,1661,1662,1613;,
+ 4;1613,1662,1663,1614;,
+ 4;1614,1663,1664,1615;,
+ 4;1615,1664,1665,1616;,
+ 4;1616,1665,1666,1617;,
+ 4;1617,1666,1667,1618;,
+ 4;1618,1667,1619,1570;,
+ 4;1619,1668,1669,1620;,
+ 4;1620,1669,1670,1621;,
+ 4;1621,1670,1671,1622;,
+ 4;1622,1671,1672,1623;,
+ 4;1623,1672,1673,1624;,
+ 4;1624,1673,1674,1625;,
+ 4;1625,1674,1675,1626;,
+ 4;1626,1675,1676,1627;,
+ 4;1627,1676,1677,1628;,
+ 4;1628,1677,1678,1629;,
+ 4;1629,1678,1679,1630;,
+ 4;1630,1679,1680,1631;,
+ 4;1633,1632,1681,1682;,
+ 4;1634,1633,1682,1683;,
+ 4;1635,1634,1683,1684;,
+ 4;1636,1635,1684,1685;,
+ 4;1637,1636,1685,1686;,
+ 4;1638,1637,1686,1687;,
+ 4;1639,1638,1687,1688;,
+ 4;1640,1639,1688,1689;,
+ 4;1641,1640,1689,1690;,
+ 4;1642,1641,1690,1691;,
+ 4;1643,1642,1691,1692;,
+ 4;1644,1643,1692,1693;,
+ 4;1645,1644,1693,1694;,
+ 4;1646,1645,1694,1695;,
+ 4;1647,1646,1695,1696;,
+ 4;1648,1647,1696,1697;,
+ 4;1649,1648,1697,1698;,
+ 4;1650,1649,1698,1699;,
+ 4;1651,1650,1699,1700;,
+ 4;1652,1651,1700,1701;,
+ 4;1653,1652,1701,1702;,
+ 4;1654,1653,1702,1703;,
+ 4;1655,1654,1703,1704;,
+ 4;1656,1655,1704,1705;,
+ 4;1656,1705,1706,1657;,
+ 4;1657,1706,1707,1658;,
+ 4;1658,1707,1708,1659;,
+ 4;1659,1708,1709,1660;,
+ 4;1660,1709,1710,1661;,
+ 4;1661,1710,1711,1662;,
+ 4;1662,1711,1712,1663;,
+ 4;1663,1712,1713,1664;,
+ 4;1664,1713,1714,1665;,
+ 4;1665,1714,1715,1666;,
+ 4;1666,1715,1716,1667;,
+ 4;1667,1716,1668,1619;,
+ 4;1668,1717,1718,1669;,
+ 4;1669,1718,1719,1670;,
+ 4;1670,1719,1720,1671;,
+ 4;1671,1720,1721,1672;,
+ 4;1672,1721,1722,1673;,
+ 4;1673,1722,1723,1674;,
+ 4;1674,1723,1724,1675;,
+ 4;1675,1724,1725,1676;,
+ 4;1676,1725,1726,1677;,
+ 4;1677,1726,1727,1678;,
+ 4;1678,1727,1728,1679;,
+ 4;1679,1728,1729,1680;,
+ 4;1682,1681,1730,1731;,
+ 4;1683,1682,1731,1732;,
+ 4;1684,1683,1732,1733;,
+ 4;1685,1684,1733,1734;,
+ 4;1686,1685,1734,1735;,
+ 4;1687,1686,1735,1736;,
+ 4;1688,1687,1736,1737;,
+ 4;1689,1688,1737,1738;,
+ 4;1690,1689,1738,1739;,
+ 4;1691,1690,1739,1740;,
+ 4;1692,1691,1740,1741;,
+ 4;1693,1692,1741,1742;,
+ 4;1694,1693,1742,1743;,
+ 4;1695,1694,1743,1744;,
+ 4;1696,1695,1744,1745;,
+ 4;1697,1696,1745,1746;,
+ 4;1698,1697,1746,1747;,
+ 4;1699,1698,1747,1748;,
+ 4;1700,1699,1748,1749;,
+ 4;1701,1700,1749,1750;,
+ 4;1702,1701,1750,1751;,
+ 4;1703,1702,1751,1752;,
+ 4;1704,1703,1752,1753;,
+ 4;1705,1704,1753,1754;,
+ 4;1705,1754,1755,1706;,
+ 4;1706,1755,1756,1707;,
+ 4;1707,1756,1757,1708;,
+ 4;1708,1757,1758,1709;,
+ 4;1709,1758,1759,1710;,
+ 4;1710,1759,1760,1711;,
+ 4;1711,1760,1761,1712;,
+ 4;1712,1761,1762,1713;,
+ 4;1713,1762,1763,1714;,
+ 4;1714,1763,1764,1715;,
+ 4;1715,1764,1765,1716;,
+ 4;1716,1765,1717,1668;,
+ 4;1717,1766,1767,1718;,
+ 4;1718,1767,1768,1719;,
+ 4;1719,1768,1769,1720;,
+ 4;1720,1769,1770,1721;,
+ 4;1721,1770,1771,1722;,
+ 4;1722,1771,1772,1723;,
+ 4;1723,1772,1773,1724;,
+ 4;1724,1773,1774,1725;,
+ 4;1725,1774,1775,1726;,
+ 4;1726,1775,1776,1727;,
+ 4;1727,1776,1777,1728;,
+ 4;1728,1777,1778,1729;,
+ 4;1731,1730,1779,1780;,
+ 4;1732,1731,1780,1781;,
+ 4;1733,1732,1781,1782;,
+ 4;1734,1733,1782,1783;,
+ 4;1735,1734,1783,1784;,
+ 4;1736,1735,1784,1785;,
+ 4;1737,1736,1785,1786;,
+ 4;1738,1737,1786,1787;,
+ 4;1739,1738,1787,1788;,
+ 4;1740,1739,1788,1789;,
+ 4;1741,1740,1789,1790;,
+ 4;1742,1741,1790,1791;,
+ 4;1743,1742,1791,1792;,
+ 4;1744,1743,1792,1793;,
+ 4;1745,1744,1793,1794;,
+ 4;1746,1745,1794,1795;,
+ 4;1747,1746,1795,1796;,
+ 4;1748,1747,1796,1797;,
+ 4;1749,1748,1797,1798;,
+ 4;1750,1749,1798,1799;,
+ 4;1751,1750,1799,1800;,
+ 4;1752,1751,1800,1801;,
+ 4;1753,1752,1801,1802;,
+ 4;1754,1753,1802,1803;,
+ 4;1754,1803,1804,1755;,
+ 4;1755,1804,1805,1756;,
+ 4;1756,1805,1806,1757;,
+ 4;1757,1806,1807,1758;,
+ 4;1758,1807,1808,1759;,
+ 4;1759,1808,1809,1760;,
+ 4;1760,1809,1810,1761;,
+ 4;1761,1810,1811,1762;,
+ 4;1762,1811,1812,1763;,
+ 4;1763,1812,1813,1764;,
+ 4;1764,1813,1814,1765;,
+ 4;1765,1814,1766,1717;,
+ 4;1766,1815,1816,1767;,
+ 4;1767,1816,1817,1768;,
+ 4;1768,1817,1818,1769;,
+ 4;1769,1818,1819,1770;,
+ 4;1770,1819,1820,1771;,
+ 4;1771,1820,1821,1772;,
+ 4;1772,1821,1822,1773;,
+ 4;1773,1822,1823,1774;,
+ 4;1774,1823,1824,1775;,
+ 4;1775,1824,1825,1776;,
+ 4;1776,1825,1826,1777;,
+ 4;1777,1826,1827,1778;,
+ 4;1780,1779,1828,1829;,
+ 4;1781,1780,1829,1830;,
+ 4;1782,1781,1830,1831;,
+ 4;1783,1782,1831,1832;,
+ 4;1784,1783,1832,1833;,
+ 4;1785,1784,1833,1834;,
+ 4;1786,1785,1834,1835;,
+ 4;1787,1786,1835,1836;,
+ 4;1788,1787,1836,1837;,
+ 4;1789,1788,1837,1838;,
+ 4;1790,1789,1838,1839;,
+ 4;1791,1790,1839,1840;,
+ 4;1792,1791,1840,1841;,
+ 4;1793,1792,1841,1842;,
+ 4;1794,1793,1842,1843;,
+ 4;1795,1794,1843,1844;,
+ 4;1796,1795,1844,1845;,
+ 4;1797,1796,1845,1846;,
+ 4;1798,1797,1846,1847;,
+ 4;1799,1798,1847,1848;,
+ 4;1800,1799,1848,1849;,
+ 4;1801,1800,1849,1850;,
+ 4;1802,1801,1850,1851;,
+ 4;1803,1802,1851,1852;,
+ 4;1803,1852,1853,1804;,
+ 4;1804,1853,1854,1805;,
+ 4;1805,1854,1855,1806;,
+ 4;1806,1855,1856,1807;,
+ 4;1807,1856,1857,1808;,
+ 4;1808,1857,1858,1809;,
+ 4;1809,1858,1859,1810;,
+ 4;1810,1859,1860,1811;,
+ 4;1811,1860,1861,1812;,
+ 4;1812,1861,1862,1813;,
+ 4;1813,1862,1863,1814;,
+ 4;1814,1863,1815,1766;,
+ 4;1815,1864,1865,1816;,
+ 4;1816,1865,1866,1817;,
+ 4;1817,1866,1867,1818;,
+ 4;1818,1867,1868,1819;,
+ 4;1819,1868,1869,1820;,
+ 4;1820,1869,1870,1821;,
+ 4;1821,1870,1871,1822;,
+ 4;1822,1871,1872,1823;,
+ 4;1823,1872,1873,1824;,
+ 4;1824,1873,1874,1825;,
+ 4;1825,1874,1875,1826;,
+ 4;1826,1875,1876,1827;,
+ 4;1829,1828,1877,1878;,
+ 4;1830,1829,1878,1879;,
+ 4;1831,1830,1879,1880;,
+ 4;1832,1831,1880,1881;,
+ 4;1833,1832,1881,1882;,
+ 4;1834,1833,1882,1883;,
+ 4;1835,1834,1883,1884;,
+ 4;1836,1835,1884,1885;,
+ 4;1837,1836,1885,1886;,
+ 4;1838,1837,1886,1887;,
+ 4;1839,1838,1887,1888;,
+ 4;1840,1839,1888,1889;,
+ 4;1841,1840,1889,1890;,
+ 4;1842,1841,1890,1891;,
+ 4;1843,1842,1891,1892;,
+ 4;1844,1843,1892,1893;,
+ 4;1845,1844,1893,1894;,
+ 4;1846,1845,1894,1895;,
+ 4;1847,1846,1895,1896;,
+ 4;1848,1847,1896,1897;,
+ 4;1849,1848,1897,1898;,
+ 4;1850,1849,1898,1899;,
+ 4;1851,1850,1899,1900;,
+ 4;1852,1851,1900,1901;,
+ 4;1852,1901,1902,1853;,
+ 4;1853,1902,1903,1854;,
+ 4;1854,1903,1904,1855;,
+ 4;1855,1904,1905,1856;,
+ 4;1856,1905,1906,1857;,
+ 4;1857,1906,1907,1858;,
+ 4;1858,1907,1908,1859;,
+ 4;1859,1908,1909,1860;,
+ 4;1860,1909,1910,1861;,
+ 4;1861,1910,1911,1862;,
+ 4;1862,1911,1912,1863;,
+ 4;1863,1912,1864,1815;,
+ 4;1864,1913,1914,1865;,
+ 4;1865,1914,1915,1866;,
+ 4;1866,1915,1916,1867;,
+ 4;1867,1916,1917,1868;,
+ 4;1868,1917,1918,1869;,
+ 4;1869,1918,1919,1870;,
+ 4;1870,1919,1920,1871;,
+ 4;1871,1920,1921,1872;,
+ 4;1872,1921,1922,1873;,
+ 4;1873,1922,1923,1874;,
+ 4;1874,1923,1924,1875;,
+ 4;1875,1924,1925,1876;,
+ 4;1878,1877,1926,1927;,
+ 4;1879,1878,1927,1928;,
+ 4;1880,1879,1928,1929;,
+ 4;1881,1880,1929,1930;,
+ 4;1882,1881,1930,1931;,
+ 4;1883,1882,1931,1932;,
+ 4;1884,1883,1932,1933;,
+ 4;1885,1884,1933,1934;,
+ 4;1886,1885,1934,1935;,
+ 4;1887,1886,1935,1936;,
+ 4;1888,1887,1936,1937;,
+ 4;1889,1888,1937,1938;,
+ 4;1890,1889,1938,1939;,
+ 4;1891,1890,1939,1940;,
+ 4;1892,1891,1940,1941;,
+ 4;1893,1892,1941,1942;,
+ 4;1894,1893,1942,1943;,
+ 4;1895,1894,1943,1944;,
+ 4;1896,1895,1944,1945;,
+ 4;1897,1896,1945,1946;,
+ 4;1898,1897,1946,1947;,
+ 4;1899,1898,1947,1948;,
+ 4;1900,1899,1948,1949;,
+ 4;1901,1900,1949,1950;,
+ 4;1901,1950,1951,1902;,
+ 4;1902,1951,1952,1903;,
+ 4;1903,1952,1953,1904;,
+ 4;1904,1953,1954,1905;,
+ 4;1905,1954,1955,1906;,
+ 4;1906,1955,1956,1907;,
+ 4;1907,1956,1957,1908;,
+ 4;1908,1957,1958,1909;,
+ 4;1909,1958,1959,1910;,
+ 4;1910,1959,1960,1911;,
+ 4;1911,1960,1961,1912;,
+ 4;1912,1961,1913,1864;,
+ 4;1913,1962,1963,1914;,
+ 4;1914,1963,1964,1915;,
+ 4;1915,1964,1965,1916;,
+ 4;1916,1965,1966,1917;,
+ 4;1917,1966,1967,1918;,
+ 4;1918,1967,1968,1919;,
+ 4;1919,1968,1969,1920;,
+ 4;1920,1969,1970,1921;,
+ 4;1921,1970,1971,1922;,
+ 4;1922,1971,1972,1923;,
+ 4;1923,1972,1973,1924;,
+ 4;1924,1973,1974,1925;,
+ 4;1927,1926,1975,1976;,
+ 4;1928,1927,1976,1977;,
+ 4;1929,1928,1977,1978;,
+ 4;1930,1929,1978,1979;,
+ 4;1931,1930,1979,1980;,
+ 4;1932,1931,1980,1981;,
+ 4;1933,1932,1981,1982;,
+ 4;1934,1933,1982,1983;,
+ 4;1935,1934,1983,1984;,
+ 4;1936,1935,1984,1985;,
+ 4;1937,1936,1985,1986;,
+ 4;1938,1937,1986,1987;,
+ 4;1939,1938,1987,1988;,
+ 4;1940,1939,1988,1989;,
+ 4;1941,1940,1989,1990;,
+ 4;1942,1941,1990,1991;,
+ 4;1943,1942,1991,1992;,
+ 4;1944,1943,1992,1993;,
+ 4;1945,1944,1993,1994;,
+ 4;1946,1945,1994,1995;,
+ 4;1947,1946,1995,1996;,
+ 4;1948,1947,1996,1997;,
+ 4;1949,1948,1997,1998;,
+ 4;1950,1949,1998,1999;,
+ 4;1950,1999,2000,1951;,
+ 4;1951,2000,2001,1952;,
+ 4;1952,2001,2002,1953;,
+ 4;1953,2002,2003,1954;,
+ 4;1954,2003,2004,1955;,
+ 4;1955,2004,2005,1956;,
+ 4;1956,2005,2006,1957;,
+ 4;1957,2006,2007,1958;,
+ 4;1958,2007,2008,1959;,
+ 4;1959,2008,2009,1960;,
+ 4;1960,2009,2010,1961;,
+ 4;1961,2010,1962,1913;,
+ 4;1962,2011,2012,1963;,
+ 4;1963,2012,2013,1964;,
+ 4;1964,2013,2014,1965;,
+ 4;1965,2014,2015,1966;,
+ 4;1966,2015,2016,1967;,
+ 4;1967,2016,2017,1968;,
+ 4;1968,2017,2018,1969;,
+ 4;1969,2018,2019,1970;,
+ 4;1970,2019,2020,1971;,
+ 4;1971,2020,2021,1972;,
+ 4;1972,2021,2022,1973;,
+ 4;1973,2022,2023,1974;,
+ 4;1976,1975,2024,2025;,
+ 4;1977,1976,2025,2026;,
+ 4;1978,1977,2026,2027;,
+ 4;1979,1978,2027,2028;,
+ 4;1980,1979,2028,2029;,
+ 4;1981,1980,2029,2030;,
+ 4;1982,1981,2030,2031;,
+ 4;1983,1982,2031,2032;,
+ 4;1984,1983,2032,2033;,
+ 4;1985,1984,2033,2034;,
+ 4;1986,1985,2034,2035;,
+ 4;1987,1986,2035,2036;,
+ 4;1988,1987,2036,2037;,
+ 4;1989,1988,2037,2038;,
+ 4;1990,1989,2038,2039;,
+ 4;1991,1990,2039,2040;,
+ 4;1992,1991,2040,2041;,
+ 4;1993,1992,2041,2042;,
+ 4;1994,1993,2042,2043;,
+ 4;1995,1994,2043,2044;,
+ 4;1996,1995,2044,2045;,
+ 4;1997,1996,2045,2046;,
+ 4;1998,1997,2046,2047;,
+ 4;1999,1998,2047,2048;,
+ 4;1999,2048,2049,2000;,
+ 4;2000,2049,2050,2001;,
+ 4;2001,2050,2051,2002;,
+ 4;2002,2051,2052,2003;,
+ 4;2003,2052,2053,2004;,
+ 4;2004,2053,2054,2005;,
+ 4;2005,2054,2055,2006;,
+ 4;2006,2055,2056,2007;,
+ 4;2007,2056,2057,2008;,
+ 4;2008,2057,2058,2009;,
+ 4;2009,2058,2059,2010;,
+ 4;2010,2059,2011,1962;,
+ 4;2011,2060,2061,2012;,
+ 4;2012,2061,2062,2013;,
+ 4;2013,2062,2063,2014;,
+ 4;2014,2063,2064,2015;,
+ 4;2015,2064,2065,2016;,
+ 4;2016,2065,2066,2017;,
+ 4;2017,2066,2067,2018;,
+ 4;2018,2067,2068,2019;,
+ 4;2019,2068,2069,2020;,
+ 4;2020,2069,2070,2021;,
+ 4;2021,2070,2071,2022;,
+ 4;2022,2071,2072,2023;,
+ 4;2025,2024,2073,2074;,
+ 4;2026,2025,2074,2075;,
+ 4;2027,2026,2075,2076;,
+ 4;2028,2027,2076,2077;,
+ 4;2029,2028,2077,2078;,
+ 4;2030,2029,2078,2079;,
+ 4;2031,2030,2079,2080;,
+ 4;2032,2031,2080,2081;,
+ 4;2033,2032,2081,2082;,
+ 4;2034,2033,2082,2083;,
+ 4;2035,2034,2083,2084;,
+ 4;2036,2035,2084,2085;,
+ 4;2037,2036,2085,2086;,
+ 4;2038,2037,2086,2087;,
+ 4;2039,2038,2087,2088;,
+ 4;2040,2039,2088,2089;,
+ 4;2041,2040,2089,2090;,
+ 4;2042,2041,2090,2091;,
+ 4;2043,2042,2091,2092;,
+ 4;2044,2043,2092,2093;,
+ 4;2045,2044,2093,2094;,
+ 4;2046,2045,2094,2095;,
+ 4;2047,2046,2095,2096;,
+ 4;2048,2047,2096,2097;,
+ 4;2048,2097,2098,2049;,
+ 4;2049,2098,2099,2050;,
+ 4;2050,2099,2100,2051;,
+ 4;2051,2100,2101,2052;,
+ 4;2052,2101,2102,2053;,
+ 4;2053,2102,2103,2054;,
+ 4;2054,2103,2104,2055;,
+ 4;2055,2104,2105,2056;,
+ 4;2056,2105,2106,2057;,
+ 4;2057,2106,2107,2058;,
+ 4;2058,2107,2108,2059;,
+ 4;2059,2108,2060,2011;,
+ 4;2060,2109,2110,2061;,
+ 4;2061,2110,2111,2062;,
+ 4;2062,2111,2112,2063;,
+ 4;2063,2112,2113,2064;,
+ 4;2064,2113,2114,2065;,
+ 4;2065,2114,2115,2066;,
+ 4;2066,2115,2116,2067;,
+ 4;2067,2116,2117,2068;,
+ 4;2068,2117,2118,2069;,
+ 4;2069,2118,2119,2070;,
+ 4;2070,2119,2120,2071;,
+ 4;2071,2120,2121,2072;,
+ 4;2074,2073,2122,2123;,
+ 4;2075,2074,2123,2124;,
+ 4;2076,2075,2124,2125;,
+ 4;2077,2076,2125,2126;,
+ 4;2078,2077,2126,2127;,
+ 4;2079,2078,2127,2128;,
+ 4;2080,2079,2128,2129;,
+ 4;2081,2080,2129,2130;,
+ 4;2082,2081,2130,2131;,
+ 4;2083,2082,2131,2132;,
+ 4;2084,2083,2132,2133;,
+ 4;2085,2084,2133,2134;,
+ 4;2086,2085,2134,2135;,
+ 4;2087,2086,2135,2136;,
+ 4;2088,2087,2136,2137;,
+ 4;2089,2088,2137,2138;,
+ 4;2090,2089,2138,2139;,
+ 4;2091,2090,2139,2140;,
+ 4;2092,2091,2140,2141;,
+ 4;2093,2092,2141,2142;,
+ 4;2094,2093,2142,2143;,
+ 4;2095,2094,2143,2144;,
+ 4;2096,2095,2144,2145;,
+ 4;2097,2096,2145,2146;,
+ 4;2097,2146,2147,2098;,
+ 4;2098,2147,2148,2099;,
+ 4;2099,2148,2149,2100;,
+ 4;2100,2149,2150,2101;,
+ 4;2101,2150,2151,2102;,
+ 4;2102,2151,2152,2103;,
+ 4;2103,2152,2153,2104;,
+ 4;2104,2153,2154,2105;,
+ 4;2105,2154,2155,2106;,
+ 4;2106,2155,2156,2107;,
+ 4;2107,2156,2157,2108;,
+ 4;2108,2157,2109,2060;,
+ 4;2109,2158,2159,2110;,
+ 4;2110,2159,2160,2111;,
+ 4;2111,2160,2161,2112;,
+ 4;2112,2161,2162,2113;,
+ 4;2113,2162,2163,2114;,
+ 4;2114,2163,2164,2115;,
+ 4;2115,2164,2165,2116;,
+ 4;2116,2165,2166,2117;,
+ 4;2117,2166,2167,2118;,
+ 4;2118,2167,2168,2119;,
+ 4;2119,2168,2169,2120;,
+ 4;2120,2169,2170,2121;,
+ 4;2123,2122,2171,2172;,
+ 4;2124,2123,2172,2173;,
+ 4;2125,2124,2173,2174;,
+ 4;2126,2125,2174,2175;,
+ 4;2127,2126,2175,2176;,
+ 4;2128,2127,2176,2177;,
+ 4;2129,2128,2177,2178;,
+ 4;2130,2129,2178,2179;,
+ 4;2131,2130,2179,2180;,
+ 4;2132,2131,2180,2181;,
+ 4;2133,2132,2181,2182;,
+ 4;2134,2133,2182,2183;,
+ 4;2135,2134,2183,2184;,
+ 4;2136,2135,2184,2185;,
+ 4;2137,2136,2185,2186;,
+ 4;2138,2137,2186,2187;,
+ 4;2139,2138,2187,2188;,
+ 4;2140,2139,2188,2189;,
+ 4;2141,2140,2189,2190;,
+ 4;2142,2141,2190,2191;,
+ 4;2143,2142,2191,2192;,
+ 4;2144,2143,2192,2193;,
+ 4;2145,2144,2193,2194;,
+ 4;2146,2145,2194,2195;,
+ 4;2146,2195,2196,2147;,
+ 4;2147,2196,2197,2148;,
+ 4;2148,2197,2198,2149;,
+ 4;2149,2198,2199,2150;,
+ 4;2150,2199,2200,2151;,
+ 4;2151,2200,2201,2152;,
+ 4;2152,2201,2202,2153;,
+ 4;2153,2202,2203,2154;,
+ 4;2154,2203,2204,2155;,
+ 4;2155,2204,2205,2156;,
+ 4;2156,2205,2206,2157;,
+ 4;2157,2206,2158,2109;,
+ 4;2158,2207,2208,2159;,
+ 4;2159,2208,2209,2160;,
+ 4;2160,2209,2210,2161;,
+ 4;2161,2210,2211,2162;,
+ 4;2162,2211,2212,2163;,
+ 4;2163,2212,2213,2164;,
+ 4;2164,2213,2214,2165;,
+ 4;2165,2214,2215,2166;,
+ 4;2166,2215,2216,2167;,
+ 4;2167,2216,2217,2168;,
+ 4;2168,2217,2218,2169;,
+ 4;2169,2218,2219,2170;,
+ 4;2172,2171,2220,2221;,
+ 4;2173,2172,2221,2222;,
+ 4;2174,2173,2222,2223;,
+ 4;2175,2174,2223,2224;,
+ 4;2176,2175,2224,2225;,
+ 4;2177,2176,2225,2226;,
+ 4;2178,2177,2226,2227;,
+ 4;2179,2178,2227,2228;,
+ 4;2180,2179,2228,2229;,
+ 4;2181,2180,2229,2230;,
+ 4;2182,2181,2230,2231;,
+ 4;2183,2182,2231,2232;,
+ 4;2184,2183,2232,2233;,
+ 4;2185,2184,2233,2234;,
+ 4;2186,2185,2234,2235;,
+ 4;2187,2186,2235,2236;,
+ 4;2188,2187,2236,2237;,
+ 4;2189,2188,2237,2238;,
+ 4;2190,2189,2238,2239;,
+ 4;2191,2190,2239,2240;,
+ 4;2192,2191,2240,2241;,
+ 4;2193,2192,2241,2242;,
+ 4;2194,2193,2242,2243;,
+ 4;2195,2194,2243,2244;,
+ 4;2195,2244,2245,2196;,
+ 4;2196,2245,2246,2197;,
+ 4;2197,2246,2247,2198;,
+ 4;2198,2247,2248,2199;,
+ 4;2199,2248,2249,2200;,
+ 4;2200,2249,2250,2201;,
+ 4;2201,2250,2251,2202;,
+ 4;2202,2251,2252,2203;,
+ 4;2203,2252,2253,2204;,
+ 4;2204,2253,2254,2205;,
+ 4;2205,2254,2255,2206;,
+ 4;2206,2255,2207,2158;,
+ 4;2207,2256,2257,2208;,
+ 4;2208,2257,2258,2209;,
+ 4;2209,2258,2259,2210;,
+ 4;2210,2259,2260,2211;,
+ 4;2211,2260,2261,2212;,
+ 4;2212,2261,2262,2213;,
+ 4;2213,2262,2263,2214;,
+ 4;2214,2263,2264,2215;,
+ 4;2215,2264,2265,2216;,
+ 4;2216,2265,2266,2217;,
+ 4;2217,2266,2267,2218;,
+ 4;2218,2267,2269,2219;,
+ 4;2221,2220,2268,2270;,
+ 4;2222,2221,2270,2271;,
+ 4;2223,2222,2271,2272;,
+ 4;2224,2223,2272,2273;,
+ 4;2225,2224,2273,2274;,
+ 4;2226,2225,2274,2275;,
+ 4;2227,2226,2275,2276;,
+ 4;2228,2227,2276,2277;,
+ 4;2229,2228,2277,2278;,
+ 4;2230,2229,2278,2279;,
+ 4;2231,2230,2279,2280;,
+ 4;2232,2231,2280,2281;,
+ 4;2233,2232,2281,2282;,
+ 4;2234,2233,2282,2283;,
+ 4;2235,2234,2283,2284;,
+ 4;2236,2235,2284,2285;,
+ 4;2237,2236,2285,2286;,
+ 4;2238,2237,2286,2287;,
+ 4;2239,2238,2287,2288;,
+ 4;2240,2239,2288,2289;,
+ 4;2241,2240,2289,2290;,
+ 4;2242,2241,2290,2291;,
+ 4;2243,2242,2291,2292;,
+ 4;2244,2243,2292,2293;,
+ 4;2244,2293,2294,2245;,
+ 4;2245,2294,2295,2246;,
+ 4;2246,2295,2296,2247;,
+ 4;2247,2296,2297,2248;,
+ 4;2248,2297,2298,2249;,
+ 4;2249,2298,2299,2250;,
+ 4;2250,2299,2300,2251;,
+ 4;2251,2300,2301,2252;,
+ 4;2252,2301,2302,2253;,
+ 4;2253,2302,2303,2254;,
+ 4;2254,2303,2304,2255;,
+ 4;2255,2304,2256,2207;,
+ 4;46,95,96,47;,
+ 4;45,94,95,46;,
+ 4;44,93,94,45;,
+ 4;43,92,93,44;,
+ 4;42,91,92,43;,
+ 4;41,90,91,42;,
+ 4;40,89,90,41;,
+ 4;39,88,89,40;,
+ 4;39,38,87,88;,
+ 4;38,37,86,87;,
+ 4;37,36,85,86;,
+ 4;36,35,84,85;,
+ 4;35,34,83,84;,
+ 4;34,33,82,83;,
+ 4;33,32,81,82;,
+ 4;32,31,80,81;,
+ 4;31,30,79,80;,
+ 4;30,29,78,79;,
+ 4;29,28,77,78;,
+ 4;28,27,76,77;,
+ 4;27,26,75,76;,
+ 4;26,25,74,75;,
+ 4;25,24,73,74;,
+ 4;24,23,72,73;,
+ 4;23,22,71,72;,
+ 4;22,21,70,71;,
+ 4;21,20,69,70;,
+ 4;20,19,68,69;,
+ 4;19,18,67,68;,
+ 4;18,17,66,67;,
+ 4;17,16,65,66;,
+ 4;16,15,64,65;,
+ 4;13,62,63,14;,
+ 4;12,61,62,13;,
+ 4;11,60,61,12;,
+ 4;10,59,60,11;,
+ 4;9,58,59,10;,
+ 4;8,57,58,9;,
+ 4;7,56,57,8;,
+ 4;6,55,56,7;,
+ 4;5,54,55,6;,
+ 4;4,53,54,5;,
+ 4;3,52,53,4;,
+ 4;2,51,52,3;,
+ 4;1153,1152,1201,1202;,
+ 4;1154,1153,1202,1203;,
+ 4;1128,1177,1129,1080;,
+ 4;1129,1178,1179,1130;;
+ }
+
+ MeshTextureCoords {
+ 2307;
+ 1.000000;0.984098;,
+ 0.000000;0.984098;,
+ 0.853882;0.973798;,
+ 0.866872;0.972205;,
+ 0.879590;0.970725;,
+ 0.892093;0.969365;,
+ 0.904426;0.968132;,
+ 0.916623;0.967031;,
+ 0.928710;0.966067;,
+ 0.940711;0.965244;,
+ 0.952644;0.964566;,
+ 0.964526;0.964036;,
+ 0.976370;0.963655;,
+ 0.988191;0.963426;,
+ 1.000000;0.963350;,
+ 0.000000;0.963350;,
+ 0.011809;0.963426;,
+ 0.023630;0.963655;,
+ 0.035474;0.964036;,
+ 0.047356;0.964566;,
+ 0.059289;0.965244;,
+ 0.071290;0.966067;,
+ 0.083377;0.967031;,
+ 0.095574;0.968132;,
+ 0.107907;0.969365;,
+ 0.120410;0.970725;,
+ 0.133128;0.972205;,
+ 0.146118;0.973798;,
+ 0.159455;0.975497;,
+ 0.173243;0.977292;,
+ 0.187629;0.979174;,
+ 0.202825;0.981130;,
+ 0.219152;0.983148;,
+ 0.237113;0.985210;,
+ 0.257541;0.987292;,
+ 0.281886;0.989359;,
+ 0.312811;0.991353;,
+ 0.355259;0.993159;,
+ 0.416933;0.994538;,
+ 0.500000;0.995087;,
+ 0.583067;0.994538;,
+ 0.644741;0.993159;,
+ 0.687189;0.991353;,
+ 0.718114;0.989359;,
+ 0.742459;0.987292;,
+ 0.762887;0.985210;,
+ 0.780848;0.983148;,
+ 0.797175;0.981130;,
+ 0.812371;0.979174;,
+ 0.826757;0.977292;,
+ 0.840545;0.975497;,
+ 0.808222;0.955418;,
+ 0.826070;0.953541;,
+ 0.843348;0.951772;,
+ 0.860148;0.950126;,
+ 0.876550;0.948619;,
+ 0.892622;0.947263;,
+ 0.908422;0.946068;,
+ 0.923999;0.945044;,
+ 0.939401;0.944196;,
+ 0.954665;0.943531;,
+ 0.969831;0.943053;,
+ 0.984932;0.942765;,
+ 1.000000;0.942669;,
+ 0.000000;0.942669;,
+ 0.015068;0.942765;,
+ 0.030169;0.943053;,
+ 0.045335;0.943531;,
+ 0.060599;0.944196;,
+ 0.076001;0.945044;,
+ 0.091578;0.946068;,
+ 0.107378;0.947263;,
+ 0.123450;0.948619;,
+ 0.139852;0.950126;,
+ 0.156652;0.951772;,
+ 0.173930;0.953541;,
+ 0.191778;0.955418;,
+ 0.210305;0.957382;,
+ 0.229640;0.959410;,
+ 0.249934;0.961473;,
+ 0.271361;0.963539;,
+ 0.294112;0.965569;,
+ 0.318390;0.967518;,
+ 0.344386;0.969331;,
+ 0.372241;0.970949;,
+ 0.401990;0.972307;,
+ 0.433490;0.973337;,
+ 0.466364;0.973983;,
+ 0.500000;0.974203;,
+ 0.533636;0.973983;,
+ 0.566510;0.973337;,
+ 0.598010;0.972307;,
+ 0.627759;0.970949;,
+ 0.655614;0.969331;,
+ 0.681610;0.967518;,
+ 0.705888;0.965569;,
+ 0.728639;0.963539;,
+ 0.750066;0.961473;,
+ 0.770360;0.959410;,
+ 0.789695;0.957382;,
+ 0.789931;0.935534;,
+ 0.809204;0.933598;,
+ 0.827973;0.931754;,
+ 0.846302;0.930026;,
+ 0.864251;0.928432;,
+ 0.881877;0.926990;,
+ 0.899229;0.925713;,
+ 0.916354;0.924614;,
+ 0.933296;0.923702;,
+ 0.950095;0.922985;,
+ 0.966788;0.922469;,
+ 0.983411;0.922157;,
+ 1.000000;0.922053;,
+ 0.000000;0.922053;,
+ 0.016589;0.922157;,
+ 0.033212;0.922469;,
+ 0.049905;0.922985;,
+ 0.066704;0.923702;,
+ 0.083646;0.924614;,
+ 0.100771;0.925713;,
+ 0.118123;0.926990;,
+ 0.135749;0.928432;,
+ 0.153698;0.930026;,
+ 0.172027;0.931754;,
+ 0.190796;0.933598;,
+ 0.210069;0.935534;,
+ 0.229918;0.937537;,
+ 0.250416;0.939578;,
+ 0.271639;0.941622;,
+ 0.293659;0.943634;,
+ 0.316540;0.945571;,
+ 0.340332;0.947388;,
+ 0.365054;0.949040;,
+ 0.390687;0.950477;,
+ 0.417159;0.951654;,
+ 0.444339;0.952529;,
+ 0.472034;0.953068;,
+ 0.500000;0.953251;,
+ 0.527966;0.953068;,
+ 0.555661;0.952529;,
+ 0.582841;0.951654;,
+ 0.609313;0.950477;,
+ 0.634946;0.949040;,
+ 0.659668;0.947388;,
+ 0.683460;0.945571;,
+ 0.706341;0.943634;,
+ 0.728361;0.941622;,
+ 0.749584;0.939578;,
+ 0.770082;0.937537;,
+ 0.780372;0.915197;,
+ 0.800228;0.913258;,
+ 0.819659;0.911402;,
+ 0.838711;0.909654;,
+ 0.857429;0.908036;,
+ 0.875857;0.906566;,
+ 0.894037;0.905261;,
+ 0.912007;0.904135;,
+ 0.929807;0.903198;,
+ 0.947471;0.902461;,
+ 0.965036;0.901929;,
+ 0.982534;0.901609;,
+ 1.000000;0.901501;,
+ 0.000000;0.901501;,
+ 0.017466;0.901609;,
+ 0.034964;0.901929;,
+ 0.052529;0.902461;,
+ 0.070193;0.903198;,
+ 0.087993;0.904135;,
+ 0.105963;0.905261;,
+ 0.124143;0.906566;,
+ 0.142571;0.908036;,
+ 0.161289;0.909654;,
+ 0.180341;0.911402;,
+ 0.199772;0.913258;,
+ 0.219628;0.915197;,
+ 0.239955;0.917190;,
+ 0.260798;0.919206;,
+ 0.282198;0.921211;,
+ 0.304189;0.923165;,
+ 0.326796;0.925031;,
+ 0.350026;0.926764;,
+ 0.373869;0.928324;,
+ 0.398287;0.929670;,
+ 0.423216;0.930762;,
+ 0.448562;0.931568;,
+ 0.474204;0.932062;,
+ 0.500000;0.932229;,
+ 0.525796;0.932062;,
+ 0.551438;0.931568;,
+ 0.576784;0.930762;,
+ 0.601713;0.929670;,
+ 0.626131;0.928324;,
+ 0.649974;0.926764;,
+ 0.673204;0.925031;,
+ 0.695811;0.923165;,
+ 0.717802;0.921211;,
+ 0.739202;0.919206;,
+ 0.760045;0.917190;,
+ 0.774560;0.894670;,
+ 0.794709;0.892754;,
+ 0.814496;0.890913;,
+ 0.833956;0.889175;,
+ 0.853123;0.887561;,
+ 0.872033;0.886092;,
+ 0.890720;0.884786;,
+ 0.909217;0.883657;,
+ 0.927558;0.882717;,
+ 0.945776;0.881977;,
+ 0.963902;0.881442;,
+ 0.981966;0.881119;,
+ 1.000000;0.881012;,
+ 0.000000;0.881012;,
+ 0.018034;0.881119;,
+ 0.036098;0.881442;,
+ 0.054224;0.881977;,
+ 0.072442;0.882717;,
+ 0.090783;0.883657;,
+ 0.109280;0.884786;,
+ 0.127967;0.886092;,
+ 0.146877;0.887561;,
+ 0.166044;0.889175;,
+ 0.185504;0.890913;,
+ 0.205291;0.892754;,
+ 0.225440;0.894670;,
+ 0.245984;0.896632;,
+ 0.266951;0.898609;,
+ 0.288367;0.900566;,
+ 0.310249;0.902466;,
+ 0.332604;0.904270;,
+ 0.355430;0.905938;,
+ 0.378707;0.907432;,
+ 0.402400;0.908715;,
+ 0.426454;0.909752;,
+ 0.450799;0.910515;,
+ 0.475347;0.910981;,
+ 0.500000;0.911139;,
+ 0.524653;0.910981;,
+ 0.549201;0.910515;,
+ 0.573546;0.909752;,
+ 0.597600;0.908715;,
+ 0.621293;0.907432;,
+ 0.644570;0.905938;,
+ 0.667396;0.904270;,
+ 0.689751;0.902466;,
+ 0.711633;0.900566;,
+ 0.733049;0.898609;,
+ 0.754016;0.896632;,
+ 0.770677;0.874045;,
+ 0.790996;0.872167;,
+ 0.811000;0.870359;,
+ 0.830717;0.868649;,
+ 0.850174;0.867058;,
+ 0.869402;0.865609;,
+ 0.888428;0.864319;,
+ 0.907284;0.863202;,
+ 0.925996;0.862272;,
+ 0.944596;0.861538;,
+ 0.963111;0.861009;,
+ 0.981569;0.860689;,
+ 1.000000;0.860582;,
+ 0.000000;0.860582;,
+ 0.018431;0.860689;,
+ 0.036889;0.861009;,
+ 0.055404;0.861538;,
+ 0.074004;0.862272;,
+ 0.092716;0.863202;,
+ 0.111572;0.864319;,
+ 0.130598;0.865609;,
+ 0.149825;0.867058;,
+ 0.169283;0.868649;,
+ 0.189000;0.870359;,
+ 0.209004;0.872167;,
+ 0.229323;0.874045;,
+ 0.249979;0.875964;,
+ 0.270995;0.877893;,
+ 0.292385;0.879797;,
+ 0.314159;0.881640;,
+ 0.336319;0.883385;,
+ 0.358855;0.884995;,
+ 0.381747;0.886432;,
+ 0.404964;0.887662;,
+ 0.428460;0.888655;,
+ 0.452177;0.889384;,
+ 0.476049;0.889830;,
+ 0.500000;0.889980;,
+ 0.523951;0.889830;,
+ 0.547823;0.889384;,
+ 0.571540;0.888655;,
+ 0.595036;0.887662;,
+ 0.618253;0.886432;,
+ 0.641145;0.884995;,
+ 0.663681;0.883385;,
+ 0.685841;0.881640;,
+ 0.707615;0.879797;,
+ 0.729005;0.877893;,
+ 0.750021;0.875964;,
+ 0.767916;0.853363;,
+ 0.788341;0.851535;,
+ 0.808489;0.849773;,
+ 0.828380;0.848104;,
+ 0.848039;0.846550;,
+ 0.867491;0.845134;,
+ 0.886759;0.843871;,
+ 0.905871;0.842778;,
+ 0.924853;0.841867;,
+ 0.943731;0.841148;,
+ 0.962531;0.840629;,
+ 0.981278;0.840315;,
+ 1.000000;0.840210;,
+ 0.000000;0.840210;,
+ 0.018722;0.840315;,
+ 0.037469;0.840629;,
+ 0.056269;0.841148;,
+ 0.075147;0.841867;,
+ 0.094129;0.842778;,
+ 0.113241;0.843871;,
+ 0.132509;0.845134;,
+ 0.151961;0.846550;,
+ 0.171620;0.848104;,
+ 0.191511;0.849773;,
+ 0.211659;0.851535;,
+ 0.232084;0.853363;,
+ 0.252805;0.855229;,
+ 0.273839;0.857101;,
+ 0.295194;0.858946;,
+ 0.316877;0.860729;,
+ 0.338885;0.862414;,
+ 0.361207;0.863966;,
+ 0.383824;0.865349;,
+ 0.406707;0.866532;,
+ 0.429818;0.867484;,
+ 0.453108;0.868183;,
+ 0.476522;0.868610;,
+ 0.500000;0.868753;,
+ 0.523478;0.868610;,
+ 0.546892;0.868183;,
+ 0.570182;0.867484;,
+ 0.593293;0.866532;,
+ 0.616176;0.865349;,
+ 0.638793;0.863966;,
+ 0.661115;0.862414;,
+ 0.683123;0.860729;,
+ 0.704806;0.858946;,
+ 0.726161;0.857101;,
+ 0.747195;0.855229;,
+ 0.765863;0.832647;,
+ 0.786360;0.830878;,
+ 0.806608;0.829172;,
+ 0.826625;0.827555;,
+ 0.846431;0.826049;,
+ 0.866047;0.824675;,
+ 0.885495;0.823449;,
+ 0.904800;0.822388;,
+ 0.923985;0.821503;,
+ 0.943073;0.820805;,
+ 0.962089;0.820301;,
+ 0.981057;0.819996;,
+ 1.000000;0.819894;,
+ 0.000000;0.819894;,
+ 0.018943;0.819996;,
+ 0.037911;0.820301;,
+ 0.056927;0.820805;,
+ 0.076015;0.821503;,
+ 0.095200;0.822388;,
+ 0.114505;0.823449;,
+ 0.133953;0.824675;,
+ 0.153569;0.826049;,
+ 0.173375;0.827555;,
+ 0.193392;0.829172;,
+ 0.213640;0.830878;,
+ 0.234137;0.832647;,
+ 0.254899;0.834450;,
+ 0.275936;0.836258;,
+ 0.297258;0.838037;,
+ 0.318865;0.839755;,
+ 0.340753;0.841377;,
+ 0.362913;0.842869;,
+ 0.385325;0.844197;,
+ 0.407963;0.845332;,
+ 0.430793;0.846245;,
+ 0.453775;0.846914;,
+ 0.476861;0.847323;,
+ 0.500000;0.847461;,
+ 0.523139;0.847323;,
+ 0.546225;0.846914;,
+ 0.569207;0.846245;,
+ 0.592037;0.845332;,
+ 0.614675;0.844197;,
+ 0.637087;0.842869;,
+ 0.659247;0.841377;,
+ 0.681135;0.839755;,
+ 0.702742;0.838037;,
+ 0.724064;0.836258;,
+ 0.745101;0.834450;,
+ 0.764285;0.811906;,
+ 0.784833;0.810206;,
+ 0.805155;0.808566;,
+ 0.825265;0.807010;,
+ 0.845182;0.805560;,
+ 0.864924;0.804237;,
+ 0.884511;0.803057;,
+ 0.903965;0.802035;,
+ 0.923307;0.801182;,
+ 0.942559;0.800509;,
+ 0.961744;0.800023;,
+ 0.980883;0.799730;,
+ 1.000000;0.799631;,
+ 0.000000;0.799631;,
+ 0.019117;0.799730;,
+ 0.038256;0.800023;,
+ 0.057441;0.800509;,
+ 0.076693;0.801182;,
+ 0.096035;0.802035;,
+ 0.115489;0.803057;,
+ 0.135076;0.804237;,
+ 0.154818;0.805560;,
+ 0.174735;0.807010;,
+ 0.194845;0.808566;,
+ 0.215167;0.810206;,
+ 0.235715;0.811906;,
+ 0.256502;0.813639;,
+ 0.277538;0.815374;,
+ 0.298828;0.817082;,
+ 0.320373;0.818729;,
+ 0.342167;0.820284;,
+ 0.364200;0.821712;,
+ 0.386454;0.822983;,
+ 0.408906;0.824068;,
+ 0.431524;0.824941;,
+ 0.454274;0.825581;,
+ 0.477114;0.825972;,
+ 0.500000;0.826103;,
+ 0.522886;0.825972;,
+ 0.545726;0.825581;,
+ 0.568476;0.824941;,
+ 0.591094;0.824068;,
+ 0.613546;0.822983;,
+ 0.635800;0.821712;,
+ 0.657833;0.820284;,
+ 0.679627;0.818729;,
+ 0.701172;0.817082;,
+ 0.722462;0.815374;,
+ 0.743498;0.813639;,
+ 0.763043;0.791150;,
+ 0.783628;0.789526;,
+ 0.804006;0.787959;,
+ 0.824188;0.786472;,
+ 0.844191;0.785087;,
+ 0.864031;0.783822;,
+ 0.883727;0.782694;,
+ 0.903299;0.781717;,
+ 0.922766;0.780902;,
+ 0.942148;0.780258;,
+ 0.961468;0.779794;,
+ 0.980744;0.779513;,
+ 1.000000;0.779419;,
+ 0.000000;0.779419;,
+ 0.019256;0.779513;,
+ 0.038532;0.779794;,
+ 0.057852;0.780258;,
+ 0.077234;0.780902;,
+ 0.096701;0.781717;,
+ 0.116273;0.782694;,
+ 0.135969;0.783822;,
+ 0.155809;0.785087;,
+ 0.175812;0.786472;,
+ 0.195994;0.787959;,
+ 0.216372;0.789526;,
+ 0.236957;0.791150;,
+ 0.257762;0.792804;,
+ 0.278794;0.794460;,
+ 0.300057;0.796089;,
+ 0.321549;0.797660;,
+ 0.343267;0.799141;,
+ 0.365199;0.800502;,
+ 0.387329;0.801713;,
+ 0.409635;0.802746;,
+ 0.432089;0.803577;,
+ 0.454659;0.804186;,
+ 0.477309;0.804558;,
+ 0.500000;0.804682;,
+ 0.522691;0.804558;,
+ 0.545341;0.804186;,
+ 0.567911;0.803577;,
+ 0.590365;0.802746;,
+ 0.612671;0.801713;,
+ 0.634801;0.800502;,
+ 0.656733;0.799141;,
+ 0.678451;0.797660;,
+ 0.699943;0.796089;,
+ 0.721206;0.794460;,
+ 0.742238;0.792804;,
+ 0.762046;0.770381;,
+ 0.782660;0.768842;,
+ 0.803081;0.767355;,
+ 0.823319;0.765945;,
+ 0.843390;0.764631;,
+ 0.863309;0.763432;,
+ 0.883093;0.762362;,
+ 0.902759;0.761434;,
+ 0.922327;0.760661;,
+ 0.941815;0.760051;,
+ 0.961244;0.759610;,
+ 0.980632;0.759344;,
+ 1.000000;0.759254;,
+ 0.000000;0.759254;,
+ 0.019368;0.759344;,
+ 0.038756;0.759610;,
+ 0.058185;0.760051;,
+ 0.077673;0.760661;,
+ 0.097241;0.761434;,
+ 0.116907;0.762362;,
+ 0.136691;0.763432;,
+ 0.156610;0.764631;,
+ 0.176681;0.765945;,
+ 0.196919;0.767355;,
+ 0.217340;0.768842;,
+ 0.237954;0.770381;,
+ 0.258771;0.771949;,
+ 0.279797;0.773519;,
+ 0.301036;0.775063;,
+ 0.322486;0.776551;,
+ 0.344141;0.777955;,
+ 0.365992;0.779244;,
+ 0.388022;0.780390;,
+ 0.410211;0.781368;,
+ 0.432535;0.782155;,
+ 0.454963;0.782731;,
+ 0.477463;0.783083;,
+ 0.500000;0.783201;,
+ 0.522537;0.783083;,
+ 0.545037;0.782731;,
+ 0.567465;0.782155;,
+ 0.589789;0.781368;,
+ 0.611978;0.780390;,
+ 0.634008;0.779244;,
+ 0.655859;0.777955;,
+ 0.677514;0.776551;,
+ 0.698964;0.775063;,
+ 0.720203;0.773519;,
+ 0.741229;0.771949;,
+ 0.761235;0.749603;,
+ 0.781871;0.748155;,
+ 0.802326;0.746757;,
+ 0.822610;0.745430;,
+ 0.842736;0.744194;,
+ 0.862718;0.743065;,
+ 0.882573;0.742058;,
+ 0.902317;0.741186;,
+ 0.921967;0.740458;,
+ 0.941542;0.739884;,
+ 0.961060;0.739469;,
+ 0.980539;0.739218;,
+ 1.000000;0.739135;,
+ 0.000000;0.739135;,
+ 0.019461;0.739218;,
+ 0.038940;0.739469;,
+ 0.058458;0.739884;,
+ 0.078033;0.740458;,
+ 0.097683;0.741186;,
+ 0.117427;0.742058;,
+ 0.137282;0.743065;,
+ 0.157264;0.744194;,
+ 0.177390;0.745430;,
+ 0.197674;0.746757;,
+ 0.218129;0.748155;,
+ 0.238765;0.749603;,
+ 0.259590;0.751078;,
+ 0.280611;0.752555;,
+ 0.301830;0.754008;,
+ 0.323243;0.755408;,
+ 0.344847;0.756728;,
+ 0.366631;0.757940;,
+ 0.388580;0.759018;,
+ 0.410675;0.759938;,
+ 0.432894;0.760678;,
+ 0.455207;0.761220;,
+ 0.477587;0.761550;,
+ 0.500000;0.761661;,
+ 0.522413;0.761550;,
+ 0.544793;0.761220;,
+ 0.567106;0.760678;,
+ 0.589325;0.759938;,
+ 0.611420;0.759018;,
+ 0.633369;0.757940;,
+ 0.655153;0.756728;,
+ 0.676757;0.755408;,
+ 0.698170;0.754008;,
+ 0.719389;0.752555;,
+ 0.740410;0.751078;,
+ 0.760569;0.728819;,
+ 0.781222;0.727468;,
+ 0.801704;0.726164;,
+ 0.822025;0.724926;,
+ 0.842196;0.723773;,
+ 0.862230;0.722721;,
+ 0.882143;0.721782;,
+ 0.901951;0.720969;,
+ 0.921669;0.720290;,
+ 0.941315;0.719755;,
+ 0.960907;0.719368;,
+ 0.980463;0.719135;,
+ 1.000000;0.719056;,
+ 0.000000;0.719056;,
+ 0.019537;0.719135;,
+ 0.039093;0.719368;,
+ 0.058685;0.719755;,
+ 0.078331;0.720290;,
+ 0.098049;0.720969;,
+ 0.117857;0.721782;,
+ 0.137770;0.722721;,
+ 0.157805;0.723773;,
+ 0.177975;0.724926;,
+ 0.198296;0.726164;,
+ 0.218778;0.727468;,
+ 0.239431;0.728819;,
+ 0.260263;0.730195;,
+ 0.281279;0.731572;,
+ 0.302479;0.732927;,
+ 0.323863;0.734233;,
+ 0.345424;0.735464;,
+ 0.367153;0.736595;,
+ 0.389035;0.737601;,
+ 0.411053;0.738459;,
+ 0.433185;0.739149;,
+ 0.455406;0.739654;,
+ 0.477688;0.739962;,
+ 0.500000;0.740066;,
+ 0.522312;0.739962;,
+ 0.544594;0.739654;,
+ 0.566815;0.739149;,
+ 0.588947;0.738459;,
+ 0.610965;0.737601;,
+ 0.632847;0.736595;,
+ 0.654576;0.735464;,
+ 0.676137;0.734233;,
+ 0.697521;0.732927;,
+ 0.718721;0.731572;,
+ 0.739737;0.730195;,
+ 0.760017;0.708029;,
+ 0.780684;0.706781;,
+ 0.801189;0.705577;,
+ 0.821539;0.704435;,
+ 0.841747;0.703370;,
+ 0.861824;0.702399;,
+ 0.881786;0.701532;,
+ 0.901646;0.700781;,
+ 0.921421;0.700155;,
+ 0.941127;0.699661;,
+ 0.960780;0.699305;,
+ 0.980399;0.699089;,
+ 1.000000;0.699017;,
+ 0.000000;0.699017;,
+ 0.019601;0.699089;,
+ 0.039220;0.699305;,
+ 0.058873;0.699661;,
+ 0.078579;0.700155;,
+ 0.098354;0.700781;,
+ 0.118214;0.701532;,
+ 0.138176;0.702399;,
+ 0.158253;0.703370;,
+ 0.178461;0.704435;,
+ 0.198811;0.705577;,
+ 0.219316;0.706781;,
+ 0.239983;0.708029;,
+ 0.260819;0.709299;,
+ 0.281830;0.710572;,
+ 0.303015;0.711823;,
+ 0.324373;0.713030;,
+ 0.345899;0.714167;,
+ 0.367582;0.715212;,
+ 0.389409;0.716141;,
+ 0.411364;0.716934;,
+ 0.433425;0.717571;,
+ 0.455569;0.718038;,
+ 0.477770;0.718323;,
+ 0.500000;0.718419;,
+ 0.522230;0.718323;,
+ 0.544431;0.718038;,
+ 0.566575;0.717571;,
+ 0.588636;0.716934;,
+ 0.610591;0.716141;,
+ 0.632418;0.715212;,
+ 0.654101;0.714167;,
+ 0.675627;0.713030;,
+ 0.696985;0.711823;,
+ 0.718170;0.710572;,
+ 0.739181;0.709299;,
+ 0.759559;0.687235;,
+ 0.780237;0.686096;,
+ 0.800760;0.684997;,
+ 0.821135;0.683955;,
+ 0.841373;0.682984;,
+ 0.861486;0.682097;,
+ 0.881488;0.681307;,
+ 0.901392;0.680622;,
+ 0.921214;0.680051;,
+ 0.940969;0.679600;,
+ 0.960674;0.679275;,
+ 0.980346;0.679079;,
+ 1.000000;0.679013;,
+ 0.000000;0.679013;,
+ 0.019654;0.679079;,
+ 0.039326;0.679275;,
+ 0.059031;0.679600;,
+ 0.078786;0.680051;,
+ 0.098608;0.680622;,
+ 0.118512;0.681307;,
+ 0.138514;0.682097;,
+ 0.158627;0.682984;,
+ 0.178865;0.683955;,
+ 0.199240;0.684997;,
+ 0.219763;0.686096;,
+ 0.240441;0.687235;,
+ 0.261281;0.688395;,
+ 0.282287;0.689556;,
+ 0.303459;0.690699;,
+ 0.324796;0.691801;,
+ 0.346292;0.692839;,
+ 0.367937;0.693794;,
+ 0.389718;0.694642;,
+ 0.411620;0.695367;,
+ 0.433623;0.695949;,
+ 0.455704;0.696375;,
+ 0.477838;0.696636;,
+ 0.500000;0.696723;,
+ 0.522162;0.696636;,
+ 0.544296;0.696375;,
+ 0.566377;0.695949;,
+ 0.588380;0.695367;,
+ 0.610282;0.694642;,
+ 0.632063;0.693794;,
+ 0.653708;0.692839;,
+ 0.675204;0.691801;,
+ 0.696541;0.690699;,
+ 0.717713;0.689556;,
+ 0.738719;0.688395;,
+ 0.759179;0.666437;,
+ 0.779866;0.665413;,
+ 0.800403;0.664424;,
+ 0.820798;0.663486;,
+ 0.841062;0.662612;,
+ 0.861205;0.661815;,
+ 0.881239;0.661104;,
+ 0.901180;0.660488;,
+ 0.921041;0.659974;,
+ 0.940838;0.659569;,
+ 0.960586;0.659277;,
+ 0.980301;0.659100;,
+ 1.000000;0.659041;,
+ 0.000000;0.659041;,
+ 0.019699;0.659100;,
+ 0.039414;0.659277;,
+ 0.059162;0.659569;,
+ 0.078959;0.659974;,
+ 0.098820;0.660488;,
+ 0.118761;0.661104;,
+ 0.138795;0.661815;,
+ 0.158938;0.662612;,
+ 0.179202;0.663486;,
+ 0.199597;0.664424;,
+ 0.220134;0.665413;,
+ 0.240821;0.666437;,
+ 0.261664;0.667482;,
+ 0.282666;0.668528;,
+ 0.303827;0.669556;,
+ 0.325146;0.670548;,
+ 0.346617;0.671484;,
+ 0.368230;0.672343;,
+ 0.389974;0.673108;,
+ 0.411832;0.673760;,
+ 0.433786;0.674285;,
+ 0.455815;0.674669;,
+ 0.477894;0.674904;,
+ 0.500000;0.674983;,
+ 0.522106;0.674904;,
+ 0.544185;0.674669;,
+ 0.566214;0.674285;,
+ 0.588168;0.673760;,
+ 0.610026;0.673108;,
+ 0.631770;0.672343;,
+ 0.653383;0.671484;,
+ 0.674854;0.670548;,
+ 0.696173;0.669556;,
+ 0.717334;0.668528;,
+ 0.738336;0.667482;,
+ 0.758864;0.645638;,
+ 0.779558;0.644731;,
+ 0.800107;0.643856;,
+ 0.820519;0.643027;,
+ 0.840804;0.642254;,
+ 0.860971;0.641549;,
+ 0.881033;0.640921;,
+ 0.901004;0.640376;,
+ 0.920898;0.639922;,
+ 0.940729;0.639564;,
+ 0.960512;0.639306;,
+ 0.980264;0.639149;,
+ 1.000000;0.639097;,
+ 0.000000;0.639097;,
+ 0.019736;0.639149;,
+ 0.039488;0.639306;,
+ 0.059271;0.639564;,
+ 0.079102;0.639922;,
+ 0.098996;0.640376;,
+ 0.118967;0.640921;,
+ 0.139029;0.641549;,
+ 0.159196;0.642254;,
+ 0.179481;0.643027;,
+ 0.199893;0.643856;,
+ 0.220442;0.644731;,
+ 0.241136;0.645638;,
+ 0.261981;0.646561;,
+ 0.282979;0.647487;,
+ 0.304132;0.648397;,
+ 0.325435;0.649275;,
+ 0.346885;0.650104;,
+ 0.368472;0.650865;,
+ 0.390184;0.651542;,
+ 0.412007;0.652119;,
+ 0.433921;0.652584;,
+ 0.455906;0.652924;,
+ 0.477941;0.653132;,
+ 0.500000;0.653202;,
+ 0.522059;0.653132;,
+ 0.544094;0.652924;,
+ 0.566079;0.652584;,
+ 0.587993;0.652119;,
+ 0.609816;0.651542;,
+ 0.631528;0.650865;,
+ 0.653115;0.650104;,
+ 0.674565;0.649275;,
+ 0.695868;0.648397;,
+ 0.717021;0.647487;,
+ 0.738019;0.646561;,
+ 0.758605;0.624836;,
+ 0.779305;0.624051;,
+ 0.799864;0.623294;,
+ 0.820290;0.622577;,
+ 0.840591;0.621909;,
+ 0.860778;0.621299;,
+ 0.880863;0.620755;,
+ 0.900859;0.620285;,
+ 0.920780;0.619892;,
+ 0.940639;0.619583;,
+ 0.960452;0.619359;,
+ 0.980234;0.619224;,
+ 1.000000;0.619179;,
+ 0.000000;0.619179;,
+ 0.019766;0.619224;,
+ 0.039548;0.619359;,
+ 0.059361;0.619583;,
+ 0.079220;0.619892;,
+ 0.099141;0.620285;,
+ 0.119137;0.620755;,
+ 0.139222;0.621299;,
+ 0.159409;0.621909;,
+ 0.179710;0.622577;,
+ 0.200136;0.623294;,
+ 0.220695;0.624051;,
+ 0.241395;0.624836;,
+ 0.262241;0.625635;,
+ 0.283236;0.626436;,
+ 0.304381;0.627224;,
+ 0.325672;0.627984;,
+ 0.347105;0.628701;,
+ 0.368670;0.629360;,
+ 0.390357;0.629947;,
+ 0.412149;0.630447;,
+ 0.434031;0.630849;,
+ 0.455981;0.631144;,
+ 0.477979;0.631324;,
+ 0.500000;0.631385;,
+ 0.522021;0.631324;,
+ 0.544019;0.631144;,
+ 0.565969;0.630849;,
+ 0.587851;0.630447;,
+ 0.609643;0.629947;,
+ 0.631330;0.629360;,
+ 0.652895;0.628701;,
+ 0.674328;0.627984;,
+ 0.695619;0.627224;,
+ 0.716764;0.626436;,
+ 0.737759;0.625635;,
+ 0.758396;0.604032;,
+ 0.779101;0.603373;,
+ 0.799668;0.602738;,
+ 0.820104;0.602135;,
+ 0.840419;0.601574;,
+ 0.860623;0.601062;,
+ 0.880726;0.600606;,
+ 0.900742;0.600211;,
+ 0.920684;0.599881;,
+ 0.940566;0.599621;,
+ 0.960403;0.599434;,
+ 0.980209;0.599320;,
+ 1.000000;0.599282;,
+ 0.000000;0.599282;,
+ 0.019791;0.599320;,
+ 0.039597;0.599434;,
+ 0.059434;0.599621;,
+ 0.079316;0.599881;,
+ 0.099258;0.600211;,
+ 0.119274;0.600606;,
+ 0.139377;0.601062;,
+ 0.159581;0.601574;,
+ 0.179896;0.602135;,
+ 0.200332;0.602738;,
+ 0.220899;0.603373;,
+ 0.241604;0.604032;,
+ 0.262451;0.604703;,
+ 0.283444;0.605376;,
+ 0.304582;0.606039;,
+ 0.325864;0.606678;,
+ 0.347282;0.607280;,
+ 0.368830;0.607834;,
+ 0.390496;0.608327;,
+ 0.412265;0.608748;,
+ 0.434120;0.609086;,
+ 0.456042;0.609334;,
+ 0.478009;0.609485;,
+ 0.500000;0.609536;,
+ 0.521991;0.609485;,
+ 0.543958;0.609334;,
+ 0.565880;0.609086;,
+ 0.587735;0.608748;,
+ 0.609504;0.608327;,
+ 0.631170;0.607834;,
+ 0.652718;0.607280;,
+ 0.674136;0.606678;,
+ 0.695418;0.606039;,
+ 0.716556;0.605376;,
+ 0.737549;0.604703;,
+ 0.758231;0.583227;,
+ 0.778939;0.582696;,
+ 0.799513;0.582185;,
+ 0.819958;0.581700;,
+ 0.840284;0.581248;,
+ 0.860500;0.580836;,
+ 0.880617;0.580469;,
+ 0.900649;0.580151;,
+ 0.920608;0.579886;,
+ 0.940508;0.579677;,
+ 0.960364;0.579526;,
+ 0.980190;0.579435;,
+ 1.000000;0.579404;,
+ 0.000000;0.579404;,
+ 0.019811;0.579435;,
+ 0.039636;0.579526;,
+ 0.059492;0.579677;,
+ 0.079392;0.579886;,
+ 0.099351;0.580151;,
+ 0.119383;0.580469;,
+ 0.139500;0.580836;,
+ 0.159716;0.581248;,
+ 0.180042;0.581700;,
+ 0.200487;0.582185;,
+ 0.221061;0.582696;,
+ 0.241769;0.583227;,
+ 0.262617;0.583768;,
+ 0.283608;0.584310;,
+ 0.304741;0.584843;,
+ 0.326014;0.585358;,
+ 0.347422;0.585843;,
+ 0.368956;0.586290;,
+ 0.390605;0.586687;,
+ 0.412355;0.587026;,
+ 0.434189;0.587299;,
+ 0.456089;0.587498;,
+ 0.478033;0.587620;,
+ 0.500000;0.587661;,
+ 0.521967;0.587620;,
+ 0.543911;0.587498;,
+ 0.565811;0.587299;,
+ 0.587645;0.587026;,
+ 0.609395;0.586687;,
+ 0.631044;0.586290;,
+ 0.652578;0.585843;,
+ 0.673986;0.585358;,
+ 0.695259;0.584843;,
+ 0.716392;0.584310;,
+ 0.737383;0.583768;,
+ 0.758107;0.562421;,
+ 0.778818;0.562021;,
+ 0.799396;0.561636;,
+ 0.819847;0.561270;,
+ 0.840181;0.560930;,
+ 0.860407;0.560619;,
+ 0.880535;0.560342;,
+ 0.900579;0.560103;,
+ 0.920551;0.559903;,
+ 0.940465;0.559746;,
+ 0.960335;0.559632;,
+ 0.980175;0.559563;,
+ 1.000000;0.559540;,
+ 0.000000;0.559540;,
+ 0.019825;0.559563;,
+ 0.039665;0.559632;,
+ 0.059535;0.559746;,
+ 0.079449;0.559903;,
+ 0.099421;0.560103;,
+ 0.119465;0.560342;,
+ 0.139593;0.560619;,
+ 0.159819;0.560930;,
+ 0.180153;0.561270;,
+ 0.200604;0.561636;,
+ 0.221182;0.562021;,
+ 0.241893;0.562421;,
+ 0.262742;0.562829;,
+ 0.283731;0.563237;,
+ 0.304861;0.563639;,
+ 0.326128;0.564028;,
+ 0.347527;0.564394;,
+ 0.369051;0.564730;,
+ 0.390688;0.565030;,
+ 0.412423;0.565286;,
+ 0.434242;0.565491;,
+ 0.456125;0.565642;,
+ 0.478051;0.565734;,
+ 0.500000;0.565765;,
+ 0.521949;0.565734;,
+ 0.543875;0.565642;,
+ 0.565758;0.565491;,
+ 0.587577;0.565286;,
+ 0.609312;0.565030;,
+ 0.630949;0.564730;,
+ 0.652473;0.564394;,
+ 0.673872;0.564028;,
+ 0.695139;0.563639;,
+ 0.716269;0.563237;,
+ 0.737258;0.562829;,
+ 0.758020;0.541614;,
+ 0.778733;0.541347;,
+ 0.799314;0.541089;,
+ 0.819770;0.540844;,
+ 0.840109;0.540617;,
+ 0.860342;0.540409;,
+ 0.880478;0.540224;,
+ 0.900530;0.540064;,
+ 0.920511;0.539930;,
+ 0.940435;0.539825;,
+ 0.960314;0.539749;,
+ 0.980164;0.539703;,
+ 1.000000;0.539687;,
+ 0.000000;0.539687;,
+ 0.019836;0.539703;,
+ 0.039686;0.539749;,
+ 0.059565;0.539825;,
+ 0.079489;0.539930;,
+ 0.099470;0.540064;,
+ 0.119522;0.540224;,
+ 0.139658;0.540409;,
+ 0.159891;0.540617;,
+ 0.180230;0.540844;,
+ 0.200686;0.541089;,
+ 0.221267;0.541347;,
+ 0.241980;0.541614;,
+ 0.262830;0.541887;,
+ 0.283818;0.542161;,
+ 0.304944;0.542430;,
+ 0.326207;0.542689;,
+ 0.347601;0.542935;,
+ 0.369117;0.543160;,
+ 0.390745;0.543360;,
+ 0.412471;0.543531;,
+ 0.434279;0.543669;,
+ 0.456150;0.543770;,
+ 0.478064;0.543832;,
+ 0.500000;0.543852;,
+ 0.521936;0.543832;,
+ 0.543850;0.543770;,
+ 0.565721;0.543669;,
+ 0.587529;0.543531;,
+ 0.609255;0.543360;,
+ 0.630883;0.543160;,
+ 0.652399;0.542935;,
+ 0.673793;0.542689;,
+ 0.695056;0.542430;,
+ 0.716182;0.542161;,
+ 0.737170;0.541887;,
+ 0.757968;0.520807;,
+ 0.778682;0.520673;,
+ 0.799265;0.520544;,
+ 0.819724;0.520421;,
+ 0.840067;0.520307;,
+ 0.860303;0.520203;,
+ 0.880444;0.520111;,
+ 0.900501;0.520030;,
+ 0.920488;0.519963;,
+ 0.940416;0.519911;,
+ 0.960302;0.519873;,
+ 0.980158;0.519850;,
+ 1.000000;0.519842;,
+ 0.000000;0.519842;,
+ 0.019842;0.519850;,
+ 0.039698;0.519873;,
+ 0.059584;0.519911;,
+ 0.079512;0.519963;,
+ 0.099499;0.520030;,
+ 0.119556;0.520111;,
+ 0.139697;0.520203;,
+ 0.159933;0.520307;,
+ 0.180276;0.520421;,
+ 0.200735;0.520544;,
+ 0.221318;0.520673;,
+ 0.242032;0.520807;,
+ 0.262881;0.520944;,
+ 0.283869;0.521081;,
+ 0.304994;0.521216;,
+ 0.326254;0.521346;,
+ 0.347644;0.521469;,
+ 0.369156;0.521582;,
+ 0.390779;0.521682;,
+ 0.412499;0.521768;,
+ 0.434300;0.521837;,
+ 0.456164;0.521888;,
+ 0.478071;0.521919;,
+ 0.500000;0.521929;,
+ 0.521929;0.521919;,
+ 0.543836;0.521888;,
+ 0.565700;0.521837;,
+ 0.587501;0.521768;,
+ 0.609221;0.521682;,
+ 0.630844;0.521582;,
+ 0.652356;0.521469;,
+ 0.673746;0.521346;,
+ 0.695006;0.521216;,
+ 0.716131;0.521081;,
+ 0.737119;0.520944;,
+ 0.757951;0.500000;,
+ 0.778665;0.500000;,
+ 0.799249;0.500000;,
+ 0.819709;0.500000;,
+ 0.840053;0.500000;,
+ 0.860290;0.500000;,
+ 0.880433;0.500000;,
+ 0.900492;0.500000;,
+ 0.920480;0.500000;,
+ 0.940410;0.500000;,
+ 0.960298;0.500000;,
+ 0.980156;0.500000;,
+ 1.000000;0.500000;,
+ 0.000000;0.500000;,
+ 0.019844;0.500000;,
+ 0.039702;0.500000;,
+ 0.059589;0.500000;,
+ 0.079520;0.500000;,
+ 0.099508;0.500000;,
+ 0.119567;0.500000;,
+ 0.139710;0.500000;,
+ 0.159947;0.500000;,
+ 0.180291;0.500000;,
+ 0.200751;0.500000;,
+ 0.221334;0.500000;,
+ 0.242049;0.500000;,
+ 0.262898;0.500000;,
+ 0.283886;0.500000;,
+ 0.305010;0.500000;,
+ 0.326270;0.500000;,
+ 0.347659;0.500000;,
+ 0.369169;0.500000;,
+ 0.390791;0.500000;,
+ 0.412509;0.500000;,
+ 0.434308;0.500000;,
+ 0.456169;0.500000;,
+ 0.478074;0.500000;,
+ 0.500000;0.500000;,
+ 0.521926;0.500000;,
+ 0.543831;0.500000;,
+ 0.565692;0.500000;,
+ 0.587491;0.500000;,
+ 0.609209;0.500000;,
+ 0.630831;0.500000;,
+ 0.652341;0.500000;,
+ 0.673730;0.500000;,
+ 0.694990;0.500000;,
+ 0.716115;0.500000;,
+ 0.737102;0.500000;,
+ 0.757968;0.479193;,
+ 0.778682;0.479327;,
+ 0.799265;0.479456;,
+ 0.819724;0.479579;,
+ 0.840067;0.479693;,
+ 0.860303;0.479797;,
+ 0.880444;0.479889;,
+ 0.900501;0.479970;,
+ 0.920488;0.480037;,
+ 0.940416;0.480089;,
+ 0.960302;0.480127;,
+ 0.980158;0.480150;,
+ 1.000000;0.480158;,
+ 0.000000;0.480158;,
+ 0.019842;0.480150;,
+ 0.039698;0.480127;,
+ 0.059584;0.480089;,
+ 0.079512;0.480037;,
+ 0.099499;0.479970;,
+ 0.119556;0.479889;,
+ 0.139697;0.479797;,
+ 0.159933;0.479693;,
+ 0.180276;0.479579;,
+ 0.200735;0.479456;,
+ 0.221318;0.479327;,
+ 0.242032;0.479193;,
+ 0.262881;0.479056;,
+ 0.283869;0.478919;,
+ 0.304994;0.478784;,
+ 0.326254;0.478654;,
+ 0.347644;0.478531;,
+ 0.369156;0.478418;,
+ 0.390779;0.478318;,
+ 0.412499;0.478232;,
+ 0.434300;0.478163;,
+ 0.456164;0.478112;,
+ 0.478071;0.478081;,
+ 0.500000;0.478071;,
+ 0.521929;0.478081;,
+ 0.543836;0.478112;,
+ 0.565700;0.478163;,
+ 0.587501;0.478232;,
+ 0.609221;0.478318;,
+ 0.630844;0.478418;,
+ 0.652356;0.478531;,
+ 0.673746;0.478654;,
+ 0.695006;0.478784;,
+ 0.716131;0.478919;,
+ 0.737119;0.479056;,
+ 0.758020;0.458386;,
+ 0.778733;0.458653;,
+ 0.799314;0.458911;,
+ 0.819770;0.459156;,
+ 0.840109;0.459383;,
+ 0.860342;0.459591;,
+ 0.880478;0.459776;,
+ 0.900530;0.459936;,
+ 0.920511;0.460070;,
+ 0.940435;0.460175;,
+ 0.960314;0.460251;,
+ 0.980164;0.460297;,
+ 1.000000;0.460313;,
+ 0.000000;0.460313;,
+ 0.019836;0.460297;,
+ 0.039686;0.460251;,
+ 0.059565;0.460175;,
+ 0.079489;0.460070;,
+ 0.099470;0.459936;,
+ 0.119522;0.459776;,
+ 0.139658;0.459591;,
+ 0.159891;0.459383;,
+ 0.180230;0.459156;,
+ 0.200686;0.458911;,
+ 0.221267;0.458653;,
+ 0.241980;0.458386;,
+ 0.262830;0.458113;,
+ 0.283818;0.457839;,
+ 0.304944;0.457570;,
+ 0.326207;0.457311;,
+ 0.347601;0.457065;,
+ 0.369117;0.456840;,
+ 0.390745;0.456640;,
+ 0.412471;0.456469;,
+ 0.434279;0.456331;,
+ 0.456150;0.456230;,
+ 0.478064;0.456168;,
+ 0.500000;0.456148;,
+ 0.521936;0.456168;,
+ 0.543850;0.456230;,
+ 0.565721;0.456331;,
+ 0.587529;0.456469;,
+ 0.609255;0.456640;,
+ 0.630883;0.456840;,
+ 0.652399;0.457065;,
+ 0.673793;0.457311;,
+ 0.695056;0.457570;,
+ 0.716182;0.457839;,
+ 0.737170;0.458113;,
+ 0.758107;0.437579;,
+ 0.778818;0.437979;,
+ 0.799396;0.438365;,
+ 0.819847;0.438730;,
+ 0.840181;0.439070;,
+ 0.860407;0.439381;,
+ 0.880535;0.439658;,
+ 0.900579;0.439897;,
+ 0.920551;0.440097;,
+ 0.940465;0.440254;,
+ 0.960335;0.440368;,
+ 0.980175;0.440437;,
+ 1.000000;0.440460;,
+ 0.000000;0.440460;,
+ 0.019825;0.440437;,
+ 0.039665;0.440368;,
+ 0.059535;0.440254;,
+ 0.079449;0.440097;,
+ 0.099421;0.439897;,
+ 0.119465;0.439658;,
+ 0.139593;0.439381;,
+ 0.159819;0.439070;,
+ 0.180153;0.438730;,
+ 0.200604;0.438365;,
+ 0.221182;0.437979;,
+ 0.241893;0.437579;,
+ 0.262742;0.437171;,
+ 0.283731;0.436763;,
+ 0.304861;0.436360;,
+ 0.326128;0.435972;,
+ 0.347527;0.435606;,
+ 0.369051;0.435270;,
+ 0.390688;0.434970;,
+ 0.412423;0.434714;,
+ 0.434242;0.434509;,
+ 0.456125;0.434358;,
+ 0.478051;0.434266;,
+ 0.500000;0.434235;,
+ 0.521949;0.434266;,
+ 0.543875;0.434358;,
+ 0.565758;0.434509;,
+ 0.587577;0.434714;,
+ 0.609312;0.434970;,
+ 0.630949;0.435270;,
+ 0.652473;0.435606;,
+ 0.673872;0.435972;,
+ 0.695139;0.436360;,
+ 0.716269;0.436763;,
+ 0.737258;0.437171;,
+ 0.758231;0.416773;,
+ 0.778939;0.417304;,
+ 0.799513;0.417815;,
+ 0.819958;0.418300;,
+ 0.840284;0.418752;,
+ 0.860500;0.419164;,
+ 0.880617;0.419531;,
+ 0.900649;0.419849;,
+ 0.920608;0.420114;,
+ 0.940508;0.420323;,
+ 0.960364;0.420474;,
+ 0.980190;0.420565;,
+ 1.000000;0.420596;,
+ 0.000000;0.420596;,
+ 0.019811;0.420565;,
+ 0.039636;0.420474;,
+ 0.059492;0.420323;,
+ 0.079392;0.420114;,
+ 0.099351;0.419849;,
+ 0.119383;0.419531;,
+ 0.139500;0.419164;,
+ 0.159716;0.418752;,
+ 0.180042;0.418300;,
+ 0.200487;0.417815;,
+ 0.221061;0.417304;,
+ 0.241769;0.416773;,
+ 0.262617;0.416232;,
+ 0.283608;0.415690;,
+ 0.304741;0.415157;,
+ 0.326014;0.414642;,
+ 0.347422;0.414157;,
+ 0.368956;0.413710;,
+ 0.390605;0.413313;,
+ 0.412355;0.412974;,
+ 0.434189;0.412701;,
+ 0.456089;0.412502;,
+ 0.478033;0.412380;,
+ 0.500000;0.412339;,
+ 0.521967;0.412380;,
+ 0.543911;0.412502;,
+ 0.565811;0.412701;,
+ 0.587645;0.412974;,
+ 0.609395;0.413313;,
+ 0.631044;0.413710;,
+ 0.652578;0.414157;,
+ 0.673986;0.414642;,
+ 0.695259;0.415157;,
+ 0.716392;0.415690;,
+ 0.737383;0.416232;,
+ 0.758396;0.395968;,
+ 0.779101;0.396627;,
+ 0.799668;0.397263;,
+ 0.820104;0.397865;,
+ 0.840419;0.398426;,
+ 0.860623;0.398938;,
+ 0.880726;0.399394;,
+ 0.900742;0.399789;,
+ 0.920684;0.400119;,
+ 0.940566;0.400379;,
+ 0.960403;0.400566;,
+ 0.980209;0.400680;,
+ 1.000000;0.400718;,
+ 0.000000;0.400718;,
+ 0.019791;0.400680;,
+ 0.039597;0.400566;,
+ 0.059434;0.400379;,
+ 0.079316;0.400119;,
+ 0.099258;0.399789;,
+ 0.119274;0.399394;,
+ 0.139377;0.398938;,
+ 0.159581;0.398426;,
+ 0.179896;0.397865;,
+ 0.200332;0.397263;,
+ 0.220899;0.396627;,
+ 0.241604;0.395968;,
+ 0.262451;0.395297;,
+ 0.283444;0.394624;,
+ 0.304582;0.393961;,
+ 0.325864;0.393322;,
+ 0.347282;0.392720;,
+ 0.368830;0.392166;,
+ 0.390496;0.391673;,
+ 0.412265;0.391252;,
+ 0.434120;0.390914;,
+ 0.456042;0.390666;,
+ 0.478009;0.390515;,
+ 0.500000;0.390464;,
+ 0.521991;0.390515;,
+ 0.543958;0.390666;,
+ 0.565880;0.390914;,
+ 0.587735;0.391252;,
+ 0.609504;0.391673;,
+ 0.631170;0.392166;,
+ 0.652718;0.392720;,
+ 0.674136;0.393322;,
+ 0.695418;0.393961;,
+ 0.716556;0.394624;,
+ 0.737549;0.395297;,
+ 0.758605;0.375165;,
+ 0.779305;0.375949;,
+ 0.799864;0.376706;,
+ 0.820290;0.377423;,
+ 0.840591;0.378091;,
+ 0.860778;0.378701;,
+ 0.880863;0.379245;,
+ 0.900859;0.379715;,
+ 0.920780;0.380108;,
+ 0.940639;0.380417;,
+ 0.960452;0.380641;,
+ 0.980234;0.380776;,
+ 1.000000;0.380821;,
+ 0.000000;0.380821;,
+ 0.019766;0.380776;,
+ 0.039548;0.380641;,
+ 0.059361;0.380417;,
+ 0.079220;0.380108;,
+ 0.099141;0.379715;,
+ 0.119137;0.379245;,
+ 0.139222;0.378701;,
+ 0.159409;0.378091;,
+ 0.179710;0.377423;,
+ 0.200136;0.376706;,
+ 0.220695;0.375949;,
+ 0.241395;0.375165;,
+ 0.262241;0.374365;,
+ 0.283236;0.373564;,
+ 0.304381;0.372776;,
+ 0.325672;0.372016;,
+ 0.347105;0.371299;,
+ 0.368670;0.370640;,
+ 0.390357;0.370053;,
+ 0.412149;0.369553;,
+ 0.434031;0.369151;,
+ 0.455981;0.368856;,
+ 0.477979;0.368676;,
+ 0.500000;0.368615;,
+ 0.522021;0.368676;,
+ 0.544019;0.368856;,
+ 0.565969;0.369151;,
+ 0.587851;0.369553;,
+ 0.609643;0.370053;,
+ 0.631330;0.370640;,
+ 0.652895;0.371299;,
+ 0.674328;0.372016;,
+ 0.695619;0.372776;,
+ 0.716764;0.373564;,
+ 0.737759;0.374365;,
+ 0.758864;0.354362;,
+ 0.779558;0.355269;,
+ 0.800107;0.356144;,
+ 0.820519;0.356973;,
+ 0.840804;0.357746;,
+ 0.860971;0.358451;,
+ 0.881033;0.359079;,
+ 0.901004;0.359624;,
+ 0.920898;0.360078;,
+ 0.940729;0.360436;,
+ 0.960512;0.360694;,
+ 0.980264;0.360851;,
+ 1.000000;0.360903;,
+ 0.000000;0.360903;,
+ 0.019736;0.360851;,
+ 0.039488;0.360694;,
+ 0.059271;0.360436;,
+ 0.079102;0.360078;,
+ 0.098996;0.359624;,
+ 0.118967;0.359079;,
+ 0.139029;0.358451;,
+ 0.159196;0.357746;,
+ 0.179481;0.356973;,
+ 0.199893;0.356144;,
+ 0.220442;0.355269;,
+ 0.241136;0.354362;,
+ 0.261981;0.353439;,
+ 0.282979;0.352513;,
+ 0.304132;0.351603;,
+ 0.325435;0.350725;,
+ 0.346885;0.349896;,
+ 0.368472;0.349135;,
+ 0.390184;0.348458;,
+ 0.412007;0.347881;,
+ 0.433921;0.347416;,
+ 0.455906;0.347076;,
+ 0.477941;0.346868;,
+ 0.500000;0.346798;,
+ 0.522059;0.346868;,
+ 0.544094;0.347076;,
+ 0.566079;0.347416;,
+ 0.587993;0.347881;,
+ 0.609816;0.348458;,
+ 0.631528;0.349135;,
+ 0.653115;0.349896;,
+ 0.674565;0.350725;,
+ 0.695868;0.351603;,
+ 0.717021;0.352513;,
+ 0.738019;0.353439;,
+ 0.759179;0.333563;,
+ 0.779866;0.334587;,
+ 0.800403;0.335576;,
+ 0.820798;0.336514;,
+ 0.841062;0.337388;,
+ 0.861205;0.338185;,
+ 0.881239;0.338896;,
+ 0.901180;0.339512;,
+ 0.921041;0.340026;,
+ 0.940838;0.340431;,
+ 0.960586;0.340723;,
+ 0.980301;0.340900;,
+ 1.000000;0.340959;,
+ 0.000000;0.340959;,
+ 0.019699;0.340900;,
+ 0.039414;0.340723;,
+ 0.059162;0.340431;,
+ 0.078959;0.340026;,
+ 0.098820;0.339512;,
+ 0.118761;0.338896;,
+ 0.138795;0.338185;,
+ 0.158938;0.337388;,
+ 0.179202;0.336514;,
+ 0.199597;0.335576;,
+ 0.220134;0.334587;,
+ 0.240821;0.333563;,
+ 0.261664;0.332518;,
+ 0.282666;0.331473;,
+ 0.303827;0.330444;,
+ 0.325146;0.329452;,
+ 0.346617;0.328516;,
+ 0.368230;0.327657;,
+ 0.389974;0.326892;,
+ 0.411832;0.326240;,
+ 0.433786;0.325715;,
+ 0.455815;0.325331;,
+ 0.477894;0.325096;,
+ 0.500000;0.325017;,
+ 0.522106;0.325096;,
+ 0.544185;0.325331;,
+ 0.566214;0.325715;,
+ 0.588168;0.326240;,
+ 0.610026;0.326892;,
+ 0.631770;0.327657;,
+ 0.653383;0.328516;,
+ 0.674854;0.329452;,
+ 0.696173;0.330444;,
+ 0.717334;0.331473;,
+ 0.738336;0.332518;,
+ 0.759559;0.312765;,
+ 0.780237;0.313904;,
+ 0.800760;0.315003;,
+ 0.821135;0.316045;,
+ 0.841373;0.317016;,
+ 0.861486;0.317903;,
+ 0.881488;0.318693;,
+ 0.901392;0.319378;,
+ 0.921214;0.319949;,
+ 0.940969;0.320400;,
+ 0.960674;0.320725;,
+ 0.980346;0.320921;,
+ 1.000000;0.320987;,
+ 0.000000;0.320987;,
+ 0.019654;0.320921;,
+ 0.039326;0.320725;,
+ 0.059031;0.320400;,
+ 0.078786;0.319949;,
+ 0.098608;0.319378;,
+ 0.118512;0.318693;,
+ 0.138514;0.317903;,
+ 0.158627;0.317016;,
+ 0.178865;0.316045;,
+ 0.199240;0.315003;,
+ 0.219763;0.313904;,
+ 0.240441;0.312765;,
+ 0.261281;0.311605;,
+ 0.282287;0.310444;,
+ 0.303459;0.309301;,
+ 0.324796;0.308199;,
+ 0.346292;0.307160;,
+ 0.367937;0.306206;,
+ 0.389718;0.305358;,
+ 0.411620;0.304633;,
+ 0.433623;0.304051;,
+ 0.455704;0.303625;,
+ 0.477838;0.303364;,
+ 0.500000;0.303277;,
+ 0.522162;0.303364;,
+ 0.544296;0.303625;,
+ 0.566377;0.304051;,
+ 0.588380;0.304633;,
+ 0.610282;0.305358;,
+ 0.632063;0.306206;,
+ 0.653708;0.307160;,
+ 0.675204;0.308199;,
+ 0.696541;0.309301;,
+ 0.717713;0.310444;,
+ 0.738719;0.311605;,
+ 0.760017;0.291971;,
+ 0.780684;0.293219;,
+ 0.801189;0.294423;,
+ 0.821539;0.295565;,
+ 0.841747;0.296630;,
+ 0.861824;0.297601;,
+ 0.881786;0.298468;,
+ 0.901646;0.299219;,
+ 0.921421;0.299845;,
+ 0.941127;0.300339;,
+ 0.960780;0.300695;,
+ 0.980399;0.300911;,
+ 1.000000;0.300983;,
+ 0.000000;0.300983;,
+ 0.019601;0.300911;,
+ 0.039220;0.300695;,
+ 0.058873;0.300339;,
+ 0.078579;0.299845;,
+ 0.098354;0.299219;,
+ 0.118214;0.298468;,
+ 0.138176;0.297601;,
+ 0.158253;0.296630;,
+ 0.178461;0.295565;,
+ 0.198811;0.294423;,
+ 0.219316;0.293219;,
+ 0.239983;0.291971;,
+ 0.260819;0.290700;,
+ 0.281830;0.289428;,
+ 0.303015;0.288177;,
+ 0.324373;0.286970;,
+ 0.345899;0.285833;,
+ 0.367582;0.284788;,
+ 0.389409;0.283859;,
+ 0.411364;0.283066;,
+ 0.433425;0.282429;,
+ 0.455569;0.281962;,
+ 0.477770;0.281677;,
+ 0.500000;0.281581;,
+ 0.522230;0.281677;,
+ 0.544431;0.281962;,
+ 0.566575;0.282429;,
+ 0.588636;0.283066;,
+ 0.610591;0.283859;,
+ 0.632418;0.284788;,
+ 0.654101;0.285833;,
+ 0.675627;0.286970;,
+ 0.696985;0.288177;,
+ 0.718170;0.289428;,
+ 0.739181;0.290700;,
+ 0.760569;0.271181;,
+ 0.781222;0.272532;,
+ 0.801704;0.273836;,
+ 0.822025;0.275074;,
+ 0.842196;0.276227;,
+ 0.862230;0.277279;,
+ 0.882143;0.278218;,
+ 0.901951;0.279031;,
+ 0.921669;0.279710;,
+ 0.941315;0.280245;,
+ 0.960907;0.280632;,
+ 0.980463;0.280865;,
+ 1.000000;0.280944;,
+ 0.000000;0.280944;,
+ 0.019537;0.280865;,
+ 0.039093;0.280632;,
+ 0.058685;0.280245;,
+ 0.078331;0.279710;,
+ 0.098049;0.279031;,
+ 0.117857;0.278218;,
+ 0.137770;0.277279;,
+ 0.157805;0.276227;,
+ 0.177975;0.275074;,
+ 0.198296;0.273836;,
+ 0.218778;0.272532;,
+ 0.239431;0.271181;,
+ 0.260263;0.269805;,
+ 0.281279;0.268428;,
+ 0.302479;0.267073;,
+ 0.323863;0.265767;,
+ 0.345424;0.264536;,
+ 0.367153;0.263405;,
+ 0.389035;0.262399;,
+ 0.411053;0.261541;,
+ 0.433185;0.260851;,
+ 0.455406;0.260346;,
+ 0.477688;0.260038;,
+ 0.500000;0.259934;,
+ 0.522312;0.260038;,
+ 0.544594;0.260346;,
+ 0.566815;0.260851;,
+ 0.588947;0.261541;,
+ 0.610965;0.262399;,
+ 0.632847;0.263405;,
+ 0.654576;0.264536;,
+ 0.676137;0.265767;,
+ 0.697521;0.267073;,
+ 0.718721;0.268428;,
+ 0.739737;0.269805;,
+ 0.761235;0.250397;,
+ 0.781871;0.251845;,
+ 0.802326;0.253243;,
+ 0.822610;0.254570;,
+ 0.842736;0.255806;,
+ 0.862718;0.256935;,
+ 0.882573;0.257942;,
+ 0.902317;0.258815;,
+ 0.921967;0.259542;,
+ 0.941542;0.260116;,
+ 0.961060;0.260531;,
+ 0.980539;0.260782;,
+ 1.000000;0.260865;,
+ 0.000000;0.260865;,
+ 0.019461;0.260782;,
+ 0.038940;0.260531;,
+ 0.058458;0.260116;,
+ 0.078033;0.259542;,
+ 0.097683;0.258815;,
+ 0.117427;0.257942;,
+ 0.137282;0.256935;,
+ 0.157264;0.255806;,
+ 0.177390;0.254570;,
+ 0.197674;0.253243;,
+ 0.218129;0.251845;,
+ 0.238765;0.250397;,
+ 0.259590;0.248922;,
+ 0.280611;0.247445;,
+ 0.301830;0.245992;,
+ 0.323243;0.244592;,
+ 0.344847;0.243272;,
+ 0.366631;0.242060;,
+ 0.388580;0.240982;,
+ 0.410675;0.240062;,
+ 0.432894;0.239322;,
+ 0.455207;0.238780;,
+ 0.477587;0.238450;,
+ 0.500000;0.238339;,
+ 0.522413;0.238450;,
+ 0.544793;0.238780;,
+ 0.567106;0.239322;,
+ 0.589325;0.240062;,
+ 0.611420;0.240982;,
+ 0.633369;0.242060;,
+ 0.655153;0.243272;,
+ 0.676757;0.244592;,
+ 0.698170;0.245992;,
+ 0.719389;0.247445;,
+ 0.740410;0.248922;,
+ 0.762046;0.229619;,
+ 0.782660;0.231158;,
+ 0.803081;0.232644;,
+ 0.823319;0.234055;,
+ 0.843390;0.235368;,
+ 0.863309;0.236568;,
+ 0.883093;0.237638;,
+ 0.902759;0.238566;,
+ 0.922327;0.239339;,
+ 0.941815;0.239949;,
+ 0.961244;0.240390;,
+ 0.980632;0.240656;,
+ 1.000000;0.240746;,
+ 0.000000;0.240746;,
+ 0.019368;0.240656;,
+ 0.038756;0.240390;,
+ 0.058185;0.239949;,
+ 0.077673;0.239339;,
+ 0.097241;0.238566;,
+ 0.116907;0.237638;,
+ 0.136691;0.236568;,
+ 0.156610;0.235368;,
+ 0.176681;0.234055;,
+ 0.196919;0.232644;,
+ 0.217340;0.231158;,
+ 0.237954;0.229619;,
+ 0.258771;0.228051;,
+ 0.279797;0.226481;,
+ 0.301036;0.224937;,
+ 0.322486;0.223449;,
+ 0.344141;0.222045;,
+ 0.365992;0.220756;,
+ 0.388022;0.219610;,
+ 0.410211;0.218632;,
+ 0.432535;0.217845;,
+ 0.454963;0.217269;,
+ 0.477463;0.216917;,
+ 0.500000;0.216799;,
+ 0.522537;0.216917;,
+ 0.545037;0.217269;,
+ 0.567465;0.217845;,
+ 0.589789;0.218632;,
+ 0.611978;0.219610;,
+ 0.634008;0.220756;,
+ 0.655859;0.222045;,
+ 0.677514;0.223449;,
+ 0.698964;0.224937;,
+ 0.720203;0.226481;,
+ 0.741229;0.228051;,
+ 0.763043;0.208850;,
+ 0.783628;0.210474;,
+ 0.804006;0.212041;,
+ 0.824188;0.213528;,
+ 0.844191;0.214913;,
+ 0.864031;0.216178;,
+ 0.883727;0.217306;,
+ 0.903299;0.218283;,
+ 0.922766;0.219098;,
+ 0.942148;0.219742;,
+ 0.961468;0.220206;,
+ 0.980744;0.220487;,
+ 1.000000;0.220581;,
+ 0.000000;0.220581;,
+ 0.019256;0.220487;,
+ 0.038532;0.220206;,
+ 0.057852;0.219742;,
+ 0.077234;0.219098;,
+ 0.096701;0.218283;,
+ 0.116273;0.217306;,
+ 0.135969;0.216178;,
+ 0.155809;0.214913;,
+ 0.175812;0.213528;,
+ 0.195994;0.212041;,
+ 0.216372;0.210474;,
+ 0.236957;0.208850;,
+ 0.257762;0.207196;,
+ 0.278794;0.205540;,
+ 0.300057;0.203911;,
+ 0.321549;0.202340;,
+ 0.343267;0.200859;,
+ 0.365199;0.199498;,
+ 0.387329;0.198287;,
+ 0.409635;0.197254;,
+ 0.432089;0.196423;,
+ 0.454659;0.195814;,
+ 0.477309;0.195442;,
+ 0.500000;0.195318;,
+ 0.522691;0.195442;,
+ 0.545341;0.195814;,
+ 0.567911;0.196423;,
+ 0.590365;0.197254;,
+ 0.612671;0.198287;,
+ 0.634801;0.199498;,
+ 0.656733;0.200859;,
+ 0.678451;0.202340;,
+ 0.699943;0.203911;,
+ 0.721206;0.205540;,
+ 0.742238;0.207196;,
+ 0.764285;0.188094;,
+ 0.784833;0.189794;,
+ 0.805155;0.191434;,
+ 0.825265;0.192990;,
+ 0.845182;0.194440;,
+ 0.864924;0.195763;,
+ 0.884511;0.196943;,
+ 0.903965;0.197965;,
+ 0.923307;0.198818;,
+ 0.942559;0.199491;,
+ 0.961744;0.199977;,
+ 0.980883;0.200270;,
+ 1.000000;0.200369;,
+ 0.000000;0.200369;,
+ 0.019117;0.200270;,
+ 0.038256;0.199977;,
+ 0.057441;0.199491;,
+ 0.076693;0.198818;,
+ 0.096035;0.197965;,
+ 0.115489;0.196943;,
+ 0.135076;0.195763;,
+ 0.154818;0.194440;,
+ 0.174735;0.192990;,
+ 0.194845;0.191434;,
+ 0.215167;0.189794;,
+ 0.235715;0.188094;,
+ 0.256502;0.186361;,
+ 0.277538;0.184626;,
+ 0.298828;0.182918;,
+ 0.320373;0.181271;,
+ 0.342167;0.179716;,
+ 0.364200;0.178288;,
+ 0.386454;0.177017;,
+ 0.408906;0.175932;,
+ 0.431524;0.175059;,
+ 0.454274;0.174419;,
+ 0.477114;0.174028;,
+ 0.500000;0.173897;,
+ 0.522886;0.174028;,
+ 0.545726;0.174419;,
+ 0.568476;0.175059;,
+ 0.591094;0.175932;,
+ 0.613546;0.177017;,
+ 0.635800;0.178288;,
+ 0.657833;0.179716;,
+ 0.679627;0.181271;,
+ 0.701172;0.182918;,
+ 0.722462;0.184626;,
+ 0.743498;0.186361;,
+ 0.765863;0.167353;,
+ 0.786360;0.169122;,
+ 0.806608;0.170828;,
+ 0.826625;0.172445;,
+ 0.846431;0.173951;,
+ 0.866047;0.175325;,
+ 0.885495;0.176551;,
+ 0.904800;0.177612;,
+ 0.923985;0.178497;,
+ 0.943073;0.179195;,
+ 0.962089;0.179699;,
+ 0.981057;0.180004;,
+ 1.000000;0.180106;,
+ 0.000000;0.180106;,
+ 0.018943;0.180004;,
+ 0.037911;0.179699;,
+ 0.056927;0.179195;,
+ 0.076015;0.178497;,
+ 0.095200;0.177612;,
+ 0.114505;0.176551;,
+ 0.133953;0.175325;,
+ 0.153569;0.173951;,
+ 0.173375;0.172445;,
+ 0.193392;0.170828;,
+ 0.213640;0.169122;,
+ 0.234137;0.167353;,
+ 0.254899;0.165550;,
+ 0.275936;0.163742;,
+ 0.297258;0.161963;,
+ 0.318865;0.160245;,
+ 0.340753;0.158623;,
+ 0.362913;0.157131;,
+ 0.385325;0.155803;,
+ 0.407963;0.154668;,
+ 0.430793;0.153755;,
+ 0.453775;0.153086;,
+ 0.476861;0.152677;,
+ 0.500000;0.152539;,
+ 0.523139;0.152677;,
+ 0.546225;0.153086;,
+ 0.569207;0.153755;,
+ 0.592037;0.154668;,
+ 0.614675;0.155803;,
+ 0.637087;0.157131;,
+ 0.659247;0.158623;,
+ 0.681135;0.160245;,
+ 0.702742;0.161963;,
+ 0.724064;0.163742;,
+ 0.745101;0.165550;,
+ 0.767916;0.146637;,
+ 0.788341;0.148465;,
+ 0.808489;0.150227;,
+ 0.828380;0.151896;,
+ 0.848039;0.153450;,
+ 0.867491;0.154866;,
+ 0.886759;0.156129;,
+ 0.905871;0.157222;,
+ 0.924853;0.158133;,
+ 0.943731;0.158852;,
+ 0.962531;0.159371;,
+ 0.981278;0.159685;,
+ 1.000000;0.159790;,
+ 0.000000;0.159790;,
+ 0.018722;0.159685;,
+ 0.037469;0.159371;,
+ 0.056269;0.158852;,
+ 0.075147;0.158133;,
+ 0.094129;0.157222;,
+ 0.113241;0.156129;,
+ 0.132509;0.154866;,
+ 0.151961;0.153450;,
+ 0.171620;0.151896;,
+ 0.191511;0.150227;,
+ 0.211659;0.148465;,
+ 0.232084;0.146637;,
+ 0.252805;0.144771;,
+ 0.273839;0.142899;,
+ 0.295194;0.141054;,
+ 0.316877;0.139271;,
+ 0.338885;0.137586;,
+ 0.361207;0.136034;,
+ 0.383824;0.134651;,
+ 0.406707;0.133469;,
+ 0.429818;0.132516;,
+ 0.453108;0.131817;,
+ 0.476522;0.131390;,
+ 0.500000;0.131247;,
+ 0.523478;0.131390;,
+ 0.546892;0.131817;,
+ 0.570182;0.132516;,
+ 0.593293;0.133469;,
+ 0.616176;0.134651;,
+ 0.638793;0.136034;,
+ 0.661115;0.137586;,
+ 0.683123;0.139271;,
+ 0.704806;0.141054;,
+ 0.726161;0.142899;,
+ 0.747195;0.144771;,
+ 0.770677;0.125955;,
+ 0.790996;0.127833;,
+ 0.811000;0.129641;,
+ 0.830717;0.131351;,
+ 0.850174;0.132942;,
+ 0.869402;0.134391;,
+ 0.888428;0.135682;,
+ 0.907284;0.136798;,
+ 0.925996;0.137728;,
+ 0.944596;0.138462;,
+ 0.963111;0.138991;,
+ 0.981569;0.139311;,
+ 1.000000;0.139418;,
+ 0.000000;0.139418;,
+ 0.018431;0.139311;,
+ 0.036889;0.138991;,
+ 0.055404;0.138462;,
+ 0.074004;0.137728;,
+ 0.092716;0.136798;,
+ 0.111572;0.135682;,
+ 0.130598;0.134391;,
+ 0.149825;0.132942;,
+ 0.169283;0.131351;,
+ 0.189000;0.129641;,
+ 0.209004;0.127833;,
+ 0.229323;0.125955;,
+ 0.249979;0.124036;,
+ 0.270995;0.122107;,
+ 0.292385;0.120203;,
+ 0.314159;0.118360;,
+ 0.336319;0.116615;,
+ 0.358855;0.115005;,
+ 0.381747;0.113568;,
+ 0.404964;0.112338;,
+ 0.428460;0.111345;,
+ 0.452177;0.110616;,
+ 0.476049;0.110170;,
+ 0.500000;0.110020;,
+ 0.523951;0.110170;,
+ 0.547823;0.110616;,
+ 0.571540;0.111345;,
+ 0.595036;0.112338;,
+ 0.618253;0.113568;,
+ 0.641145;0.115005;,
+ 0.663681;0.116615;,
+ 0.685841;0.118360;,
+ 0.707615;0.120203;,
+ 0.729005;0.122107;,
+ 0.750021;0.124036;,
+ 0.774560;0.105330;,
+ 0.794709;0.107246;,
+ 0.814496;0.109087;,
+ 0.833956;0.110825;,
+ 0.853123;0.112439;,
+ 0.872033;0.113908;,
+ 0.890720;0.115214;,
+ 0.909217;0.116343;,
+ 0.927558;0.117283;,
+ 0.945776;0.118023;,
+ 0.963902;0.118558;,
+ 0.981966;0.118881;,
+ 1.000000;0.118988;,
+ 0.000000;0.118988;,
+ 0.018034;0.118881;,
+ 0.036098;0.118558;,
+ 0.054224;0.118023;,
+ 0.072442;0.117283;,
+ 0.090783;0.116343;,
+ 0.109280;0.115214;,
+ 0.127967;0.113908;,
+ 0.146877;0.112439;,
+ 0.166044;0.110825;,
+ 0.185504;0.109087;,
+ 0.205291;0.107246;,
+ 0.225440;0.105330;,
+ 0.245984;0.103368;,
+ 0.266951;0.101391;,
+ 0.288367;0.099434;,
+ 0.310249;0.097534;,
+ 0.332604;0.095730;,
+ 0.355430;0.094062;,
+ 0.378707;0.092568;,
+ 0.402400;0.091285;,
+ 0.426454;0.090248;,
+ 0.450799;0.089485;,
+ 0.475347;0.089019;,
+ 0.500000;0.088861;,
+ 0.524653;0.089019;,
+ 0.549201;0.089485;,
+ 0.573546;0.090248;,
+ 0.597600;0.091285;,
+ 0.621293;0.092568;,
+ 0.644570;0.094062;,
+ 0.667396;0.095730;,
+ 0.689751;0.097534;,
+ 0.711633;0.099434;,
+ 0.733049;0.101391;,
+ 0.754016;0.103368;,
+ 0.780372;0.084803;,
+ 0.800228;0.086742;,
+ 0.819659;0.088598;,
+ 0.838711;0.090346;,
+ 0.857429;0.091964;,
+ 0.875857;0.093434;,
+ 0.894037;0.094739;,
+ 0.912007;0.095865;,
+ 0.929807;0.096802;,
+ 0.947471;0.097539;,
+ 0.965036;0.098071;,
+ 0.982534;0.098391;,
+ 1.000000;0.098499;,
+ 0.000000;0.098499;,
+ 0.017466;0.098391;,
+ 0.034964;0.098071;,
+ 0.052529;0.097539;,
+ 0.070193;0.096802;,
+ 0.087993;0.095865;,
+ 0.105963;0.094739;,
+ 0.124143;0.093434;,
+ 0.142571;0.091964;,
+ 0.161289;0.090346;,
+ 0.180341;0.088598;,
+ 0.199772;0.086742;,
+ 0.219628;0.084803;,
+ 0.239955;0.082810;,
+ 0.260798;0.080794;,
+ 0.282198;0.078789;,
+ 0.304189;0.076835;,
+ 0.326796;0.074969;,
+ 0.350026;0.073236;,
+ 0.373869;0.071676;,
+ 0.398287;0.070330;,
+ 0.423216;0.069238;,
+ 0.448562;0.068432;,
+ 0.474204;0.067938;,
+ 0.500000;0.067771;,
+ 0.525796;0.067938;,
+ 0.551438;0.068432;,
+ 0.576784;0.069238;,
+ 0.601713;0.070330;,
+ 0.626131;0.071676;,
+ 0.649974;0.073236;,
+ 0.673204;0.074969;,
+ 0.695811;0.076835;,
+ 0.717802;0.078789;,
+ 0.739202;0.080794;,
+ 0.760045;0.082810;,
+ 0.789931;0.064466;,
+ 0.809204;0.066402;,
+ 0.827973;0.068246;,
+ 0.846302;0.069974;,
+ 0.864251;0.071568;,
+ 0.881877;0.073010;,
+ 0.899229;0.074287;,
+ 0.916354;0.075386;,
+ 0.933296;0.076298;,
+ 0.950095;0.077015;,
+ 0.966788;0.077531;,
+ 0.983411;0.077843;,
+ 1.000000;0.077947;,
+ 0.000000;0.077947;,
+ 0.016589;0.077843;,
+ 0.033212;0.077531;,
+ 0.049905;0.077015;,
+ 0.066704;0.076298;,
+ 0.083646;0.075386;,
+ 0.100771;0.074287;,
+ 0.118123;0.073010;,
+ 0.135749;0.071568;,
+ 0.153698;0.069974;,
+ 0.172027;0.068246;,
+ 0.190796;0.066402;,
+ 0.210069;0.064466;,
+ 0.229918;0.062463;,
+ 0.250416;0.060422;,
+ 0.271639;0.058378;,
+ 0.293659;0.056366;,
+ 0.316540;0.054429;,
+ 0.340332;0.052612;,
+ 0.365054;0.050960;,
+ 0.390687;0.049523;,
+ 0.417159;0.048346;,
+ 0.444339;0.047471;,
+ 0.472034;0.046932;,
+ 0.500000;0.046749;,
+ 0.527966;0.046932;,
+ 0.555661;0.047471;,
+ 0.582841;0.048346;,
+ 0.609313;0.049523;,
+ 0.634946;0.050960;,
+ 0.659668;0.052612;,
+ 0.683460;0.054429;,
+ 0.706341;0.056366;,
+ 0.728361;0.058378;,
+ 0.749584;0.060422;,
+ 0.770082;0.062463;,
+ 0.808222;0.044582;,
+ 0.826070;0.046459;,
+ 0.843348;0.048229;,
+ 0.860148;0.049874;,
+ 0.876550;0.051381;,
+ 0.892622;0.052737;,
+ 0.908422;0.053932;,
+ 0.923999;0.054956;,
+ 0.939401;0.055804;,
+ 0.954665;0.056469;,
+ 0.969831;0.056947;,
+ 0.984932;0.057235;,
+ 1.000000;0.057331;,
+ 0.000000;0.057331;,
+ 0.015068;0.057235;,
+ 0.030169;0.056947;,
+ 0.045335;0.056469;,
+ 0.060599;0.055804;,
+ 0.076001;0.054956;,
+ 0.091578;0.053932;,
+ 0.107378;0.052737;,
+ 0.123450;0.051381;,
+ 0.139852;0.049874;,
+ 0.156652;0.048229;,
+ 0.173930;0.046459;,
+ 0.191778;0.044582;,
+ 0.210305;0.042618;,
+ 0.229640;0.040590;,
+ 0.249934;0.038527;,
+ 0.271361;0.036461;,
+ 0.294112;0.034431;,
+ 0.318390;0.032482;,
+ 0.344386;0.030669;,
+ 0.372241;0.029051;,
+ 0.401990;0.027694;,
+ 0.433490;0.026663;,
+ 0.466364;0.026017;,
+ 0.500000;0.025797;,
+ 0.533636;0.026017;,
+ 0.566510;0.026663;,
+ 0.598010;0.027694;,
+ 0.627759;0.029051;,
+ 0.655614;0.030669;,
+ 0.681610;0.032482;,
+ 0.705888;0.034431;,
+ 0.728639;0.036461;,
+ 0.750066;0.038527;,
+ 0.770360;0.040590;,
+ 0.789695;0.042618;,
+ 0.853882;0.026202;,
+ 0.866872;0.027795;,
+ 0.879590;0.029275;,
+ 0.892093;0.030635;,
+ 0.904426;0.031868;,
+ 0.916623;0.032969;,
+ 0.928710;0.033933;,
+ 0.940711;0.034756;,
+ 0.952644;0.035434;,
+ 0.964526;0.035964;,
+ 0.976370;0.036345;,
+ 0.988191;0.036574;,
+ 0.000000;0.036650;,
+ 1.000000;0.036650;,
+ 0.011809;0.036574;,
+ 0.023630;0.036345;,
+ 0.035474;0.035964;,
+ 0.047356;0.035434;,
+ 0.059289;0.034756;,
+ 0.071290;0.033933;,
+ 0.083377;0.032969;,
+ 0.095574;0.031868;,
+ 0.107907;0.030635;,
+ 0.120410;0.029275;,
+ 0.133128;0.027795;,
+ 0.146118;0.026202;,
+ 0.159455;0.024503;,
+ 0.173243;0.022708;,
+ 0.187629;0.020826;,
+ 0.202825;0.018870;,
+ 0.219152;0.016852;,
+ 0.237113;0.014790;,
+ 0.257541;0.012708;,
+ 0.281886;0.010641;,
+ 0.312811;0.008647;,
+ 0.355259;0.006841;,
+ 0.416933;0.005462;,
+ 0.500000;0.004913;,
+ 0.583067;0.005462;,
+ 0.644741;0.006841;,
+ 0.687189;0.008647;,
+ 0.718114;0.010641;,
+ 0.742459;0.012708;,
+ 0.762887;0.014790;,
+ 0.780848;0.016852;,
+ 0.797175;0.018870;,
+ 0.812371;0.020826;,
+ 0.826757;0.022708;,
+ 0.840545;0.024503;,
+ 1.000000;0.015902;,
+ 0.000000;0.015902;;
+ }
+
+ VertexDuplicationIndices {
+ 2307;
+ 2306;
+ 0,
+ 0,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 14,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 63,
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71,
+ 72,
+ 73,
+ 74,
+ 75,
+ 76,
+ 77,
+ 78,
+ 79,
+ 80,
+ 81,
+ 82,
+ 83,
+ 84,
+ 85,
+ 86,
+ 87,
+ 88,
+ 89,
+ 90,
+ 91,
+ 92,
+ 93,
+ 94,
+ 95,
+ 96,
+ 97,
+ 98,
+ 99,
+ 100,
+ 101,
+ 102,
+ 103,
+ 104,
+ 105,
+ 106,
+ 107,
+ 108,
+ 109,
+ 110,
+ 111,
+ 112,
+ 112,
+ 114,
+ 115,
+ 116,
+ 117,
+ 118,
+ 119,
+ 120,
+ 121,
+ 122,
+ 123,
+ 124,
+ 125,
+ 126,
+ 127,
+ 128,
+ 129,
+ 130,
+ 131,
+ 132,
+ 133,
+ 134,
+ 135,
+ 136,
+ 137,
+ 138,
+ 139,
+ 140,
+ 141,
+ 142,
+ 143,
+ 144,
+ 145,
+ 146,
+ 147,
+ 148,
+ 149,
+ 150,
+ 151,
+ 152,
+ 153,
+ 154,
+ 155,
+ 156,
+ 157,
+ 158,
+ 159,
+ 160,
+ 161,
+ 161,
+ 163,
+ 164,
+ 165,
+ 166,
+ 167,
+ 168,
+ 169,
+ 170,
+ 171,
+ 172,
+ 173,
+ 174,
+ 175,
+ 176,
+ 177,
+ 178,
+ 179,
+ 180,
+ 181,
+ 182,
+ 183,
+ 184,
+ 185,
+ 186,
+ 187,
+ 188,
+ 189,
+ 190,
+ 191,
+ 192,
+ 193,
+ 194,
+ 195,
+ 196,
+ 197,
+ 198,
+ 199,
+ 200,
+ 201,
+ 202,
+ 203,
+ 204,
+ 205,
+ 206,
+ 207,
+ 208,
+ 209,
+ 210,
+ 210,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217,
+ 218,
+ 219,
+ 220,
+ 221,
+ 222,
+ 223,
+ 224,
+ 225,
+ 226,
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233,
+ 234,
+ 235,
+ 236,
+ 237,
+ 238,
+ 239,
+ 240,
+ 241,
+ 242,
+ 243,
+ 244,
+ 245,
+ 246,
+ 247,
+ 248,
+ 249,
+ 250,
+ 251,
+ 252,
+ 253,
+ 254,
+ 255,
+ 256,
+ 257,
+ 258,
+ 259,
+ 259,
+ 261,
+ 262,
+ 263,
+ 264,
+ 265,
+ 266,
+ 267,
+ 268,
+ 269,
+ 270,
+ 271,
+ 272,
+ 273,
+ 274,
+ 275,
+ 276,
+ 277,
+ 278,
+ 279,
+ 280,
+ 281,
+ 282,
+ 283,
+ 284,
+ 285,
+ 286,
+ 287,
+ 288,
+ 289,
+ 290,
+ 291,
+ 292,
+ 293,
+ 294,
+ 295,
+ 296,
+ 297,
+ 298,
+ 299,
+ 300,
+ 301,
+ 302,
+ 303,
+ 304,
+ 305,
+ 306,
+ 307,
+ 308,
+ 308,
+ 310,
+ 311,
+ 312,
+ 313,
+ 314,
+ 315,
+ 316,
+ 317,
+ 318,
+ 319,
+ 320,
+ 321,
+ 322,
+ 323,
+ 324,
+ 325,
+ 326,
+ 327,
+ 328,
+ 329,
+ 330,
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336,
+ 337,
+ 338,
+ 339,
+ 340,
+ 341,
+ 342,
+ 343,
+ 344,
+ 345,
+ 346,
+ 347,
+ 348,
+ 349,
+ 350,
+ 351,
+ 352,
+ 353,
+ 354,
+ 355,
+ 356,
+ 357,
+ 357,
+ 359,
+ 360,
+ 361,
+ 362,
+ 363,
+ 364,
+ 365,
+ 366,
+ 367,
+ 368,
+ 369,
+ 370,
+ 371,
+ 372,
+ 373,
+ 374,
+ 375,
+ 376,
+ 377,
+ 378,
+ 379,
+ 380,
+ 381,
+ 382,
+ 383,
+ 384,
+ 385,
+ 386,
+ 387,
+ 388,
+ 389,
+ 390,
+ 391,
+ 392,
+ 393,
+ 394,
+ 395,
+ 396,
+ 397,
+ 398,
+ 399,
+ 400,
+ 401,
+ 402,
+ 403,
+ 404,
+ 405,
+ 406,
+ 406,
+ 408,
+ 409,
+ 410,
+ 411,
+ 412,
+ 413,
+ 414,
+ 415,
+ 416,
+ 417,
+ 418,
+ 419,
+ 420,
+ 421,
+ 422,
+ 423,
+ 424,
+ 425,
+ 426,
+ 427,
+ 428,
+ 429,
+ 430,
+ 431,
+ 432,
+ 433,
+ 434,
+ 435,
+ 436,
+ 437,
+ 438,
+ 439,
+ 440,
+ 441,
+ 442,
+ 443,
+ 444,
+ 445,
+ 446,
+ 447,
+ 448,
+ 449,
+ 450,
+ 451,
+ 452,
+ 453,
+ 454,
+ 455,
+ 455,
+ 457,
+ 458,
+ 459,
+ 460,
+ 461,
+ 462,
+ 463,
+ 464,
+ 465,
+ 466,
+ 467,
+ 468,
+ 469,
+ 470,
+ 471,
+ 472,
+ 473,
+ 474,
+ 475,
+ 476,
+ 477,
+ 478,
+ 479,
+ 480,
+ 481,
+ 482,
+ 483,
+ 484,
+ 485,
+ 486,
+ 487,
+ 488,
+ 489,
+ 490,
+ 491,
+ 492,
+ 493,
+ 494,
+ 495,
+ 496,
+ 497,
+ 498,
+ 499,
+ 500,
+ 501,
+ 502,
+ 503,
+ 504,
+ 504,
+ 506,
+ 507,
+ 508,
+ 509,
+ 510,
+ 511,
+ 512,
+ 513,
+ 514,
+ 515,
+ 516,
+ 517,
+ 518,
+ 519,
+ 520,
+ 521,
+ 522,
+ 523,
+ 524,
+ 525,
+ 526,
+ 527,
+ 528,
+ 529,
+ 530,
+ 531,
+ 532,
+ 533,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ 541,
+ 542,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 548,
+ 549,
+ 550,
+ 551,
+ 552,
+ 553,
+ 553,
+ 555,
+ 556,
+ 557,
+ 558,
+ 559,
+ 560,
+ 561,
+ 562,
+ 563,
+ 564,
+ 565,
+ 566,
+ 567,
+ 568,
+ 569,
+ 570,
+ 571,
+ 572,
+ 573,
+ 574,
+ 575,
+ 576,
+ 577,
+ 578,
+ 579,
+ 580,
+ 581,
+ 582,
+ 583,
+ 584,
+ 585,
+ 586,
+ 587,
+ 588,
+ 589,
+ 590,
+ 591,
+ 592,
+ 593,
+ 594,
+ 595,
+ 596,
+ 597,
+ 598,
+ 599,
+ 600,
+ 601,
+ 602,
+ 602,
+ 604,
+ 605,
+ 606,
+ 607,
+ 608,
+ 609,
+ 610,
+ 611,
+ 612,
+ 613,
+ 614,
+ 615,
+ 616,
+ 617,
+ 618,
+ 619,
+ 620,
+ 621,
+ 622,
+ 623,
+ 624,
+ 625,
+ 626,
+ 627,
+ 628,
+ 629,
+ 630,
+ 631,
+ 632,
+ 633,
+ 634,
+ 635,
+ 636,
+ 637,
+ 638,
+ 639,
+ 640,
+ 641,
+ 642,
+ 643,
+ 644,
+ 645,
+ 646,
+ 647,
+ 648,
+ 649,
+ 650,
+ 651,
+ 651,
+ 653,
+ 654,
+ 655,
+ 656,
+ 657,
+ 658,
+ 659,
+ 660,
+ 661,
+ 662,
+ 663,
+ 664,
+ 665,
+ 666,
+ 667,
+ 668,
+ 669,
+ 670,
+ 671,
+ 672,
+ 673,
+ 674,
+ 675,
+ 676,
+ 677,
+ 678,
+ 679,
+ 680,
+ 681,
+ 682,
+ 683,
+ 684,
+ 685,
+ 686,
+ 687,
+ 688,
+ 689,
+ 690,
+ 691,
+ 692,
+ 693,
+ 694,
+ 695,
+ 696,
+ 697,
+ 698,
+ 699,
+ 700,
+ 700,
+ 702,
+ 703,
+ 704,
+ 705,
+ 706,
+ 707,
+ 708,
+ 709,
+ 710,
+ 711,
+ 712,
+ 713,
+ 714,
+ 715,
+ 716,
+ 717,
+ 718,
+ 719,
+ 720,
+ 721,
+ 722,
+ 723,
+ 724,
+ 725,
+ 726,
+ 727,
+ 728,
+ 729,
+ 730,
+ 731,
+ 732,
+ 733,
+ 734,
+ 735,
+ 736,
+ 737,
+ 738,
+ 739,
+ 740,
+ 741,
+ 742,
+ 743,
+ 744,
+ 745,
+ 746,
+ 747,
+ 748,
+ 749,
+ 749,
+ 751,
+ 752,
+ 753,
+ 754,
+ 755,
+ 756,
+ 757,
+ 758,
+ 759,
+ 760,
+ 761,
+ 762,
+ 763,
+ 764,
+ 765,
+ 766,
+ 767,
+ 768,
+ 769,
+ 770,
+ 771,
+ 772,
+ 773,
+ 774,
+ 775,
+ 776,
+ 777,
+ 778,
+ 779,
+ 780,
+ 781,
+ 782,
+ 783,
+ 784,
+ 785,
+ 786,
+ 787,
+ 788,
+ 789,
+ 790,
+ 791,
+ 792,
+ 793,
+ 794,
+ 795,
+ 796,
+ 797,
+ 798,
+ 798,
+ 800,
+ 801,
+ 802,
+ 803,
+ 804,
+ 805,
+ 806,
+ 807,
+ 808,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813,
+ 814,
+ 815,
+ 816,
+ 817,
+ 818,
+ 819,
+ 820,
+ 821,
+ 822,
+ 823,
+ 824,
+ 825,
+ 826,
+ 827,
+ 828,
+ 829,
+ 830,
+ 831,
+ 832,
+ 833,
+ 834,
+ 835,
+ 836,
+ 837,
+ 838,
+ 839,
+ 840,
+ 841,
+ 842,
+ 843,
+ 844,
+ 845,
+ 846,
+ 847,
+ 847,
+ 849,
+ 850,
+ 851,
+ 852,
+ 853,
+ 854,
+ 855,
+ 856,
+ 857,
+ 858,
+ 859,
+ 860,
+ 861,
+ 862,
+ 863,
+ 864,
+ 865,
+ 866,
+ 867,
+ 868,
+ 869,
+ 870,
+ 871,
+ 872,
+ 873,
+ 874,
+ 875,
+ 876,
+ 877,
+ 878,
+ 879,
+ 880,
+ 881,
+ 882,
+ 883,
+ 884,
+ 885,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890,
+ 891,
+ 892,
+ 893,
+ 894,
+ 895,
+ 896,
+ 896,
+ 898,
+ 899,
+ 900,
+ 901,
+ 902,
+ 903,
+ 904,
+ 905,
+ 906,
+ 907,
+ 908,
+ 909,
+ 910,
+ 911,
+ 912,
+ 913,
+ 914,
+ 915,
+ 916,
+ 917,
+ 918,
+ 919,
+ 920,
+ 921,
+ 922,
+ 923,
+ 924,
+ 925,
+ 926,
+ 927,
+ 928,
+ 929,
+ 930,
+ 931,
+ 932,
+ 933,
+ 934,
+ 935,
+ 936,
+ 937,
+ 938,
+ 939,
+ 940,
+ 941,
+ 942,
+ 943,
+ 944,
+ 945,
+ 945,
+ 947,
+ 948,
+ 949,
+ 950,
+ 951,
+ 952,
+ 953,
+ 954,
+ 955,
+ 956,
+ 957,
+ 958,
+ 959,
+ 960,
+ 961,
+ 962,
+ 963,
+ 964,
+ 965,
+ 966,
+ 967,
+ 968,
+ 969,
+ 970,
+ 971,
+ 972,
+ 973,
+ 974,
+ 975,
+ 976,
+ 977,
+ 978,
+ 979,
+ 980,
+ 981,
+ 982,
+ 983,
+ 984,
+ 985,
+ 986,
+ 987,
+ 988,
+ 989,
+ 990,
+ 991,
+ 992,
+ 993,
+ 994,
+ 994,
+ 996,
+ 997,
+ 998,
+ 999,
+ 1000,
+ 1001,
+ 1002,
+ 1003,
+ 1004,
+ 1005,
+ 1006,
+ 1007,
+ 1008,
+ 1009,
+ 1010,
+ 1011,
+ 1012,
+ 1013,
+ 1014,
+ 1015,
+ 1016,
+ 1017,
+ 1018,
+ 1019,
+ 1020,
+ 1021,
+ 1022,
+ 1023,
+ 1024,
+ 1025,
+ 1026,
+ 1027,
+ 1028,
+ 1029,
+ 1030,
+ 1031,
+ 1032,
+ 1033,
+ 1034,
+ 1035,
+ 1036,
+ 1037,
+ 1038,
+ 1039,
+ 1040,
+ 1041,
+ 1042,
+ 1043,
+ 1043,
+ 1045,
+ 1046,
+ 1047,
+ 1048,
+ 1049,
+ 1050,
+ 1051,
+ 1052,
+ 1053,
+ 1054,
+ 1055,
+ 1056,
+ 1057,
+ 1058,
+ 1059,
+ 1060,
+ 1061,
+ 1062,
+ 1063,
+ 1064,
+ 1065,
+ 1066,
+ 1067,
+ 1068,
+ 1069,
+ 1070,
+ 1071,
+ 1072,
+ 1073,
+ 1074,
+ 1075,
+ 1076,
+ 1077,
+ 1078,
+ 1079,
+ 1080,
+ 1081,
+ 1082,
+ 1083,
+ 1084,
+ 1085,
+ 1086,
+ 1087,
+ 1088,
+ 1089,
+ 1090,
+ 1091,
+ 1092,
+ 1092,
+ 1094,
+ 1095,
+ 1096,
+ 1097,
+ 1098,
+ 1099,
+ 1100,
+ 1101,
+ 1102,
+ 1103,
+ 1104,
+ 1105,
+ 1106,
+ 1107,
+ 1108,
+ 1109,
+ 1110,
+ 1111,
+ 1112,
+ 1113,
+ 1114,
+ 1115,
+ 1116,
+ 1117,
+ 1118,
+ 1119,
+ 1120,
+ 1121,
+ 1122,
+ 1123,
+ 1124,
+ 1125,
+ 1126,
+ 1127,
+ 1128,
+ 1129,
+ 1130,
+ 1131,
+ 1132,
+ 1133,
+ 1134,
+ 1135,
+ 1136,
+ 1137,
+ 1138,
+ 1139,
+ 1140,
+ 1141,
+ 1141,
+ 1143,
+ 1144,
+ 1145,
+ 1146,
+ 1147,
+ 1148,
+ 1149,
+ 1150,
+ 1151,
+ 1152,
+ 1153,
+ 1154,
+ 1155,
+ 1156,
+ 1157,
+ 1158,
+ 1159,
+ 1160,
+ 1161,
+ 1162,
+ 1163,
+ 1164,
+ 1165,
+ 1166,
+ 1167,
+ 1168,
+ 1169,
+ 1170,
+ 1171,
+ 1172,
+ 1173,
+ 1174,
+ 1175,
+ 1176,
+ 1177,
+ 1178,
+ 1179,
+ 1180,
+ 1181,
+ 1182,
+ 1183,
+ 1184,
+ 1185,
+ 1186,
+ 1187,
+ 1188,
+ 1189,
+ 1190,
+ 1190,
+ 1192,
+ 1193,
+ 1194,
+ 1195,
+ 1196,
+ 1197,
+ 1198,
+ 1199,
+ 1200,
+ 1201,
+ 1202,
+ 1203,
+ 1204,
+ 1205,
+ 1206,
+ 1207,
+ 1208,
+ 1209,
+ 1210,
+ 1211,
+ 1212,
+ 1213,
+ 1214,
+ 1215,
+ 1216,
+ 1217,
+ 1218,
+ 1219,
+ 1220,
+ 1221,
+ 1222,
+ 1223,
+ 1224,
+ 1225,
+ 1226,
+ 1227,
+ 1228,
+ 1229,
+ 1230,
+ 1231,
+ 1232,
+ 1233,
+ 1234,
+ 1235,
+ 1236,
+ 1237,
+ 1238,
+ 1239,
+ 1239,
+ 1241,
+ 1242,
+ 1243,
+ 1244,
+ 1245,
+ 1246,
+ 1247,
+ 1248,
+ 1249,
+ 1250,
+ 1251,
+ 1252,
+ 1253,
+ 1254,
+ 1255,
+ 1256,
+ 1257,
+ 1258,
+ 1259,
+ 1260,
+ 1261,
+ 1262,
+ 1263,
+ 1264,
+ 1265,
+ 1266,
+ 1267,
+ 1268,
+ 1269,
+ 1270,
+ 1271,
+ 1272,
+ 1273,
+ 1274,
+ 1275,
+ 1276,
+ 1277,
+ 1278,
+ 1279,
+ 1280,
+ 1281,
+ 1282,
+ 1283,
+ 1284,
+ 1285,
+ 1286,
+ 1287,
+ 1288,
+ 1288,
+ 1290,
+ 1291,
+ 1292,
+ 1293,
+ 1294,
+ 1295,
+ 1296,
+ 1297,
+ 1298,
+ 1299,
+ 1300,
+ 1301,
+ 1302,
+ 1303,
+ 1304,
+ 1305,
+ 1306,
+ 1307,
+ 1308,
+ 1309,
+ 1310,
+ 1311,
+ 1312,
+ 1313,
+ 1314,
+ 1315,
+ 1316,
+ 1317,
+ 1318,
+ 1319,
+ 1320,
+ 1321,
+ 1322,
+ 1323,
+ 1324,
+ 1325,
+ 1326,
+ 1327,
+ 1328,
+ 1329,
+ 1330,
+ 1331,
+ 1332,
+ 1333,
+ 1334,
+ 1335,
+ 1336,
+ 1337,
+ 1337,
+ 1339,
+ 1340,
+ 1341,
+ 1342,
+ 1343,
+ 1344,
+ 1345,
+ 1346,
+ 1347,
+ 1348,
+ 1349,
+ 1350,
+ 1351,
+ 1352,
+ 1353,
+ 1354,
+ 1355,
+ 1356,
+ 1357,
+ 1358,
+ 1359,
+ 1360,
+ 1361,
+ 1362,
+ 1363,
+ 1364,
+ 1365,
+ 1366,
+ 1367,
+ 1368,
+ 1369,
+ 1370,
+ 1371,
+ 1372,
+ 1373,
+ 1374,
+ 1375,
+ 1376,
+ 1377,
+ 1378,
+ 1379,
+ 1380,
+ 1381,
+ 1382,
+ 1383,
+ 1384,
+ 1385,
+ 1386,
+ 1386,
+ 1388,
+ 1389,
+ 1390,
+ 1391,
+ 1392,
+ 1393,
+ 1394,
+ 1395,
+ 1396,
+ 1397,
+ 1398,
+ 1399,
+ 1400,
+ 1401,
+ 1402,
+ 1403,
+ 1404,
+ 1405,
+ 1406,
+ 1407,
+ 1408,
+ 1409,
+ 1410,
+ 1411,
+ 1412,
+ 1413,
+ 1414,
+ 1415,
+ 1416,
+ 1417,
+ 1418,
+ 1419,
+ 1420,
+ 1421,
+ 1422,
+ 1423,
+ 1424,
+ 1425,
+ 1426,
+ 1427,
+ 1428,
+ 1429,
+ 1430,
+ 1431,
+ 1432,
+ 1433,
+ 1434,
+ 1435,
+ 1435,
+ 1437,
+ 1438,
+ 1439,
+ 1440,
+ 1441,
+ 1442,
+ 1443,
+ 1444,
+ 1445,
+ 1446,
+ 1447,
+ 1448,
+ 1449,
+ 1450,
+ 1451,
+ 1452,
+ 1453,
+ 1454,
+ 1455,
+ 1456,
+ 1457,
+ 1458,
+ 1459,
+ 1460,
+ 1461,
+ 1462,
+ 1463,
+ 1464,
+ 1465,
+ 1466,
+ 1467,
+ 1468,
+ 1469,
+ 1470,
+ 1471,
+ 1472,
+ 1473,
+ 1474,
+ 1475,
+ 1476,
+ 1477,
+ 1478,
+ 1479,
+ 1480,
+ 1481,
+ 1482,
+ 1483,
+ 1484,
+ 1484,
+ 1486,
+ 1487,
+ 1488,
+ 1489,
+ 1490,
+ 1491,
+ 1492,
+ 1493,
+ 1494,
+ 1495,
+ 1496,
+ 1497,
+ 1498,
+ 1499,
+ 1500,
+ 1501,
+ 1502,
+ 1503,
+ 1504,
+ 1505,
+ 1506,
+ 1507,
+ 1508,
+ 1509,
+ 1510,
+ 1511,
+ 1512,
+ 1513,
+ 1514,
+ 1515,
+ 1516,
+ 1517,
+ 1518,
+ 1519,
+ 1520,
+ 1521,
+ 1522,
+ 1523,
+ 1524,
+ 1525,
+ 1526,
+ 1527,
+ 1528,
+ 1529,
+ 1530,
+ 1531,
+ 1532,
+ 1533,
+ 1533,
+ 1535,
+ 1536,
+ 1537,
+ 1538,
+ 1539,
+ 1540,
+ 1541,
+ 1542,
+ 1543,
+ 1544,
+ 1545,
+ 1546,
+ 1547,
+ 1548,
+ 1549,
+ 1550,
+ 1551,
+ 1552,
+ 1553,
+ 1554,
+ 1555,
+ 1556,
+ 1557,
+ 1558,
+ 1559,
+ 1560,
+ 1561,
+ 1562,
+ 1563,
+ 1564,
+ 1565,
+ 1566,
+ 1567,
+ 1568,
+ 1569,
+ 1570,
+ 1571,
+ 1572,
+ 1573,
+ 1574,
+ 1575,
+ 1576,
+ 1577,
+ 1578,
+ 1579,
+ 1580,
+ 1581,
+ 1582,
+ 1582,
+ 1584,
+ 1585,
+ 1586,
+ 1587,
+ 1588,
+ 1589,
+ 1590,
+ 1591,
+ 1592,
+ 1593,
+ 1594,
+ 1595,
+ 1596,
+ 1597,
+ 1598,
+ 1599,
+ 1600,
+ 1601,
+ 1602,
+ 1603,
+ 1604,
+ 1605,
+ 1606,
+ 1607,
+ 1608,
+ 1609,
+ 1610,
+ 1611,
+ 1612,
+ 1613,
+ 1614,
+ 1615,
+ 1616,
+ 1617,
+ 1618,
+ 1619,
+ 1620,
+ 1621,
+ 1622,
+ 1623,
+ 1624,
+ 1625,
+ 1626,
+ 1627,
+ 1628,
+ 1629,
+ 1630,
+ 1631,
+ 1631,
+ 1633,
+ 1634,
+ 1635,
+ 1636,
+ 1637,
+ 1638,
+ 1639,
+ 1640,
+ 1641,
+ 1642,
+ 1643,
+ 1644,
+ 1645,
+ 1646,
+ 1647,
+ 1648,
+ 1649,
+ 1650,
+ 1651,
+ 1652,
+ 1653,
+ 1654,
+ 1655,
+ 1656,
+ 1657,
+ 1658,
+ 1659,
+ 1660,
+ 1661,
+ 1662,
+ 1663,
+ 1664,
+ 1665,
+ 1666,
+ 1667,
+ 1668,
+ 1669,
+ 1670,
+ 1671,
+ 1672,
+ 1673,
+ 1674,
+ 1675,
+ 1676,
+ 1677,
+ 1678,
+ 1679,
+ 1680,
+ 1680,
+ 1682,
+ 1683,
+ 1684,
+ 1685,
+ 1686,
+ 1687,
+ 1688,
+ 1689,
+ 1690,
+ 1691,
+ 1692,
+ 1693,
+ 1694,
+ 1695,
+ 1696,
+ 1697,
+ 1698,
+ 1699,
+ 1700,
+ 1701,
+ 1702,
+ 1703,
+ 1704,
+ 1705,
+ 1706,
+ 1707,
+ 1708,
+ 1709,
+ 1710,
+ 1711,
+ 1712,
+ 1713,
+ 1714,
+ 1715,
+ 1716,
+ 1717,
+ 1718,
+ 1719,
+ 1720,
+ 1721,
+ 1722,
+ 1723,
+ 1724,
+ 1725,
+ 1726,
+ 1727,
+ 1728,
+ 1729,
+ 1729,
+ 1731,
+ 1732,
+ 1733,
+ 1734,
+ 1735,
+ 1736,
+ 1737,
+ 1738,
+ 1739,
+ 1740,
+ 1741,
+ 1742,
+ 1743,
+ 1744,
+ 1745,
+ 1746,
+ 1747,
+ 1748,
+ 1749,
+ 1750,
+ 1751,
+ 1752,
+ 1753,
+ 1754,
+ 1755,
+ 1756,
+ 1757,
+ 1758,
+ 1759,
+ 1760,
+ 1761,
+ 1762,
+ 1763,
+ 1764,
+ 1765,
+ 1766,
+ 1767,
+ 1768,
+ 1769,
+ 1770,
+ 1771,
+ 1772,
+ 1773,
+ 1774,
+ 1775,
+ 1776,
+ 1777,
+ 1778,
+ 1778,
+ 1780,
+ 1781,
+ 1782,
+ 1783,
+ 1784,
+ 1785,
+ 1786,
+ 1787,
+ 1788,
+ 1789,
+ 1790,
+ 1791,
+ 1792,
+ 1793,
+ 1794,
+ 1795,
+ 1796,
+ 1797,
+ 1798,
+ 1799,
+ 1800,
+ 1801,
+ 1802,
+ 1803,
+ 1804,
+ 1805,
+ 1806,
+ 1807,
+ 1808,
+ 1809,
+ 1810,
+ 1811,
+ 1812,
+ 1813,
+ 1814,
+ 1815,
+ 1816,
+ 1817,
+ 1818,
+ 1819,
+ 1820,
+ 1821,
+ 1822,
+ 1823,
+ 1824,
+ 1825,
+ 1826,
+ 1827,
+ 1827,
+ 1829,
+ 1830,
+ 1831,
+ 1832,
+ 1833,
+ 1834,
+ 1835,
+ 1836,
+ 1837,
+ 1838,
+ 1839,
+ 1840,
+ 1841,
+ 1842,
+ 1843,
+ 1844,
+ 1845,
+ 1846,
+ 1847,
+ 1848,
+ 1849,
+ 1850,
+ 1851,
+ 1852,
+ 1853,
+ 1854,
+ 1855,
+ 1856,
+ 1857,
+ 1858,
+ 1859,
+ 1860,
+ 1861,
+ 1862,
+ 1863,
+ 1864,
+ 1865,
+ 1866,
+ 1867,
+ 1868,
+ 1869,
+ 1870,
+ 1871,
+ 1872,
+ 1873,
+ 1874,
+ 1875,
+ 1876,
+ 1876,
+ 1878,
+ 1879,
+ 1880,
+ 1881,
+ 1882,
+ 1883,
+ 1884,
+ 1885,
+ 1886,
+ 1887,
+ 1888,
+ 1889,
+ 1890,
+ 1891,
+ 1892,
+ 1893,
+ 1894,
+ 1895,
+ 1896,
+ 1897,
+ 1898,
+ 1899,
+ 1900,
+ 1901,
+ 1902,
+ 1903,
+ 1904,
+ 1905,
+ 1906,
+ 1907,
+ 1908,
+ 1909,
+ 1910,
+ 1911,
+ 1912,
+ 1913,
+ 1914,
+ 1915,
+ 1916,
+ 1917,
+ 1918,
+ 1919,
+ 1920,
+ 1921,
+ 1922,
+ 1923,
+ 1924,
+ 1925,
+ 1925,
+ 1927,
+ 1928,
+ 1929,
+ 1930,
+ 1931,
+ 1932,
+ 1933,
+ 1934,
+ 1935,
+ 1936,
+ 1937,
+ 1938,
+ 1939,
+ 1940,
+ 1941,
+ 1942,
+ 1943,
+ 1944,
+ 1945,
+ 1946,
+ 1947,
+ 1948,
+ 1949,
+ 1950,
+ 1951,
+ 1952,
+ 1953,
+ 1954,
+ 1955,
+ 1956,
+ 1957,
+ 1958,
+ 1959,
+ 1960,
+ 1961,
+ 1962,
+ 1963,
+ 1964,
+ 1965,
+ 1966,
+ 1967,
+ 1968,
+ 1969,
+ 1970,
+ 1971,
+ 1972,
+ 1973,
+ 1974,
+ 1974,
+ 1976,
+ 1977,
+ 1978,
+ 1979,
+ 1980,
+ 1981,
+ 1982,
+ 1983,
+ 1984,
+ 1985,
+ 1986,
+ 1987,
+ 1988,
+ 1989,
+ 1990,
+ 1991,
+ 1992,
+ 1993,
+ 1994,
+ 1995,
+ 1996,
+ 1997,
+ 1998,
+ 1999,
+ 2000,
+ 2001,
+ 2002,
+ 2003,
+ 2004,
+ 2005,
+ 2006,
+ 2007,
+ 2008,
+ 2009,
+ 2010,
+ 2011,
+ 2012,
+ 2013,
+ 2014,
+ 2015,
+ 2016,
+ 2017,
+ 2018,
+ 2019,
+ 2020,
+ 2021,
+ 2022,
+ 2023,
+ 2023,
+ 2025,
+ 2026,
+ 2027,
+ 2028,
+ 2029,
+ 2030,
+ 2031,
+ 2032,
+ 2033,
+ 2034,
+ 2035,
+ 2036,
+ 2037,
+ 2038,
+ 2039,
+ 2040,
+ 2041,
+ 2042,
+ 2043,
+ 2044,
+ 2045,
+ 2046,
+ 2047,
+ 2048,
+ 2049,
+ 2050,
+ 2051,
+ 2052,
+ 2053,
+ 2054,
+ 2055,
+ 2056,
+ 2057,
+ 2058,
+ 2059,
+ 2060,
+ 2061,
+ 2062,
+ 2063,
+ 2064,
+ 2065,
+ 2066,
+ 2067,
+ 2068,
+ 2069,
+ 2070,
+ 2071,
+ 2072,
+ 2072,
+ 2074,
+ 2075,
+ 2076,
+ 2077,
+ 2078,
+ 2079,
+ 2080,
+ 2081,
+ 2082,
+ 2083,
+ 2084,
+ 2085,
+ 2086,
+ 2087,
+ 2088,
+ 2089,
+ 2090,
+ 2091,
+ 2092,
+ 2093,
+ 2094,
+ 2095,
+ 2096,
+ 2097,
+ 2098,
+ 2099,
+ 2100,
+ 2101,
+ 2102,
+ 2103,
+ 2104,
+ 2105,
+ 2106,
+ 2107,
+ 2108,
+ 2109,
+ 2110,
+ 2111,
+ 2112,
+ 2113,
+ 2114,
+ 2115,
+ 2116,
+ 2117,
+ 2118,
+ 2119,
+ 2120,
+ 2121,
+ 2121,
+ 2123,
+ 2124,
+ 2125,
+ 2126,
+ 2127,
+ 2128,
+ 2129,
+ 2130,
+ 2131,
+ 2132,
+ 2133,
+ 2134,
+ 2135,
+ 2136,
+ 2137,
+ 2138,
+ 2139,
+ 2140,
+ 2141,
+ 2142,
+ 2143,
+ 2144,
+ 2145,
+ 2146,
+ 2147,
+ 2148,
+ 2149,
+ 2150,
+ 2151,
+ 2152,
+ 2153,
+ 2154,
+ 2155,
+ 2156,
+ 2157,
+ 2158,
+ 2159,
+ 2160,
+ 2161,
+ 2162,
+ 2163,
+ 2164,
+ 2165,
+ 2166,
+ 2167,
+ 2168,
+ 2169,
+ 2170,
+ 2170,
+ 2172,
+ 2173,
+ 2174,
+ 2175,
+ 2176,
+ 2177,
+ 2178,
+ 2179,
+ 2180,
+ 2181,
+ 2182,
+ 2183,
+ 2184,
+ 2185,
+ 2186,
+ 2187,
+ 2188,
+ 2189,
+ 2190,
+ 2191,
+ 2192,
+ 2193,
+ 2194,
+ 2195,
+ 2196,
+ 2197,
+ 2198,
+ 2199,
+ 2200,
+ 2201,
+ 2202,
+ 2203,
+ 2204,
+ 2205,
+ 2206,
+ 2207,
+ 2208,
+ 2209,
+ 2210,
+ 2211,
+ 2212,
+ 2213,
+ 2214,
+ 2215,
+ 2216,
+ 2217,
+ 2218,
+ 2219,
+ 2219,
+ 2221,
+ 2222,
+ 2223,
+ 2224,
+ 2225,
+ 2226,
+ 2227,
+ 2228,
+ 2229,
+ 2230,
+ 2231,
+ 2232,
+ 2233,
+ 2234,
+ 2235,
+ 2236,
+ 2237,
+ 2238,
+ 2239,
+ 2240,
+ 2241,
+ 2242,
+ 2243,
+ 2244,
+ 2245,
+ 2246,
+ 2247,
+ 2248,
+ 2249,
+ 2250,
+ 2251,
+ 2252,
+ 2253,
+ 2254,
+ 2255,
+ 2256,
+ 2257,
+ 2258,
+ 2259,
+ 2260,
+ 2261,
+ 2262,
+ 2263,
+ 2264,
+ 2265,
+ 2266,
+ 2267,
+ 2268,
+ 2268,
+ 2270,
+ 2271,
+ 2272,
+ 2273,
+ 2274,
+ 2275,
+ 2276,
+ 2277,
+ 2278,
+ 2279,
+ 2280,
+ 2281,
+ 2282,
+ 2283,
+ 2284,
+ 2285,
+ 2286,
+ 2287,
+ 2288,
+ 2289,
+ 2290,
+ 2291,
+ 2292,
+ 2293,
+ 2294,
+ 2295,
+ 2296,
+ 2297,
+ 2298,
+ 2299,
+ 2300,
+ 2301,
+ 2302,
+ 2303,
+ 2304,
+ 2305,
+ 2305;
+ }
+
+ MeshMaterialList {
+ 1;
+ 2304;
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0;
+
+ Material {
+ 1.000000;1.000000;1.000000;1.000000;;
+ 51.200001;
+ 0.000000;0.000000;0.000000;;
+ 0.000000;0.000000;0.000000;;
+ TextureFilename {
+ "earth\\earth.bmp";
+ }
+ }
+ }
+ }
+ }
+}
+
+AnimationSet AnimationSet_sphere {
+
+ Animation Animation0 {
+ { Frame1_sphere_lwo_layer1 }
+ AnimationKey {
+ 0;
+ 61;
+ 0;4;1.000000,0.000000,0.000000,0.000000;;,
+ 1;4;1.000000,0.000000,0.000000,0.000000;;,
+ 2;4;1.000000,0.000000,0.000000,0.000000;;,
+ 3;4;1.000000,0.000000,0.000000,0.000000;;,
+ 4;4;1.000000,0.000000,0.000000,0.000000;;,
+ 5;4;1.000000,0.000000,0.000000,0.000000;;,
+ 6;4;1.000000,0.000000,0.000000,0.000000;;,
+ 7;4;1.000000,0.000000,0.000000,0.000000;;,
+ 8;4;1.000000,0.000000,0.000000,0.000000;;,
+ 9;4;1.000000,0.000000,0.000000,0.000000;;,
+ 10;4;1.000000,0.000000,0.000000,0.000000;;,
+ 11;4;1.000000,0.000000,0.000000,0.000000;;,
+ 12;4;1.000000,0.000000,0.000000,0.000000;;,
+ 13;4;1.000000,0.000000,0.000000,0.000000;;,
+ 14;4;1.000000,0.000000,0.000000,0.000000;;,
+ 15;4;1.000000,0.000000,0.000000,0.000000;;,
+ 16;4;1.000000,0.000000,0.000000,0.000000;;,
+ 17;4;1.000000,0.000000,0.000000,0.000000;;,
+ 18;4;1.000000,0.000000,0.000000,0.000000;;,
+ 19;4;1.000000,0.000000,0.000000,0.000000;;,
+ 20;4;1.000000,0.000000,0.000000,0.000000;;,
+ 21;4;1.000000,0.000000,0.000000,0.000000;;,
+ 22;4;1.000000,0.000000,0.000000,0.000000;;,
+ 23;4;1.000000,0.000000,0.000000,0.000000;;,
+ 24;4;1.000000,0.000000,0.000000,0.000000;;,
+ 25;4;1.000000,0.000000,0.000000,0.000000;;,
+ 26;4;1.000000,0.000000,0.000000,0.000000;;,
+ 27;4;1.000000,0.000000,0.000000,0.000000;;,
+ 28;4;1.000000,0.000000,0.000000,0.000000;;,
+ 29;4;1.000000,0.000000,0.000000,0.000000;;,
+ 30;4;1.000000,0.000000,0.000000,0.000000;;,
+ 31;4;1.000000,0.000000,0.000000,0.000000;;,
+ 32;4;1.000000,0.000000,0.000000,0.000000;;,
+ 33;4;1.000000,0.000000,0.000000,0.000000;;,
+ 34;4;1.000000,0.000000,0.000000,0.000000;;,
+ 35;4;1.000000,0.000000,0.000000,0.000000;;,
+ 36;4;1.000000,0.000000,0.000000,0.000000;;,
+ 37;4;1.000000,0.000000,0.000000,0.000000;;,
+ 38;4;1.000000,0.000000,0.000000,0.000000;;,
+ 39;4;1.000000,0.000000,0.000000,0.000000;;,
+ 40;4;1.000000,0.000000,0.000000,0.000000;;,
+ 41;4;1.000000,0.000000,0.000000,0.000000;;,
+ 42;4;1.000000,0.000000,0.000000,0.000000;;,
+ 43;4;1.000000,0.000000,0.000000,0.000000;;,
+ 44;4;1.000000,0.000000,0.000000,0.000000;;,
+ 45;4;1.000000,0.000000,0.000000,0.000000;;,
+ 46;4;1.000000,0.000000,0.000000,0.000000;;,
+ 47;4;1.000000,0.000000,0.000000,0.000000;;,
+ 48;4;1.000000,0.000000,0.000000,0.000000;;,
+ 49;4;1.000000,0.000000,0.000000,0.000000;;,
+ 50;4;1.000000,0.000000,0.000000,0.000000;;,
+ 51;4;1.000000,0.000000,0.000000,0.000000;;,
+ 52;4;1.000000,0.000000,0.000000,0.000000;;,
+ 53;4;1.000000,0.000000,0.000000,0.000000;;,
+ 54;4;1.000000,0.000000,0.000000,0.000000;;,
+ 55;4;1.000000,0.000000,0.000000,0.000000;;,
+ 56;4;1.000000,0.000000,0.000000,0.000000;;,
+ 57;4;1.000000,0.000000,0.000000,0.000000;;,
+ 58;4;1.000000,0.000000,0.000000,0.000000;;,
+ 59;4;1.000000,0.000000,0.000000,0.000000;;,
+ 60;4;1.000000,0.000000,0.000000,0.000000;;;
+ }
+ AnimationKey {
+ 1;
+ 61;
+ 0;3;1.000000,1.000000,1.000000;;,
+ 1;3;1.000000,1.000000,1.000000;;,
+ 2;3;1.000000,1.000000,1.000000;;,
+ 3;3;1.000000,1.000000,1.000000;;,
+ 4;3;1.000000,1.000000,1.000000;;,
+ 5;3;1.000000,1.000000,1.000000;;,
+ 6;3;1.000000,1.000000,1.000000;;,
+ 7;3;1.000000,1.000000,1.000000;;,
+ 8;3;1.000000,1.000000,1.000000;;,
+ 9;3;1.000000,1.000000,1.000000;;,
+ 10;3;1.000000,1.000000,1.000000;;,
+ 11;3;1.000000,1.000000,1.000000;;,
+ 12;3;1.000000,1.000000,1.000000;;,
+ 13;3;1.000000,1.000000,1.000000;;,
+ 14;3;1.000000,1.000000,1.000000;;,
+ 15;3;1.000000,1.000000,1.000000;;,
+ 16;3;1.000000,1.000000,1.000000;;,
+ 17;3;1.000000,1.000000,1.000000;;,
+ 18;3;1.000000,1.000000,1.000000;;,
+ 19;3;1.000000,1.000000,1.000000;;,
+ 20;3;1.000000,1.000000,1.000000;;,
+ 21;3;1.000000,1.000000,1.000000;;,
+ 22;3;1.000000,1.000000,1.000000;;,
+ 23;3;1.000000,1.000000,1.000000;;,
+ 24;3;1.000000,1.000000,1.000000;;,
+ 25;3;1.000000,1.000000,1.000000;;,
+ 26;3;1.000000,1.000000,1.000000;;,
+ 27;3;1.000000,1.000000,1.000000;;,
+ 28;3;1.000000,1.000000,1.000000;;,
+ 29;3;1.000000,1.000000,1.000000;;,
+ 30;3;1.000000,1.000000,1.000000;;,
+ 31;3;1.000000,1.000000,1.000000;;,
+ 32;3;1.000000,1.000000,1.000000;;,
+ 33;3;1.000000,1.000000,1.000000;;,
+ 34;3;1.000000,1.000000,1.000000;;,
+ 35;3;1.000000,1.000000,1.000000;;,
+ 36;3;1.000000,1.000000,1.000000;;,
+ 37;3;1.000000,1.000000,1.000000;;,
+ 38;3;1.000000,1.000000,1.000000;;,
+ 39;3;1.000000,1.000000,1.000000;;,
+ 40;3;1.000000,1.000000,1.000000;;,
+ 41;3;1.000000,1.000000,1.000000;;,
+ 42;3;1.000000,1.000000,1.000000;;,
+ 43;3;1.000000,1.000000,1.000000;;,
+ 44;3;1.000000,1.000000,1.000000;;,
+ 45;3;1.000000,1.000000,1.000000;;,
+ 46;3;1.000000,1.000000,1.000000;;,
+ 47;3;1.000000,1.000000,1.000000;;,
+ 48;3;1.000000,1.000000,1.000000;;,
+ 49;3;1.000000,1.000000,1.000000;;,
+ 50;3;1.000000,1.000000,1.000000;;,
+ 51;3;1.000000,1.000000,1.000000;;,
+ 52;3;1.000000,1.000000,1.000000;;,
+ 53;3;1.000000,1.000000,1.000000;;,
+ 54;3;1.000000,1.000000,1.000000;;,
+ 55;3;1.000000,1.000000,1.000000;;,
+ 56;3;1.000000,1.000000,1.000000;;,
+ 57;3;1.000000,1.000000,1.000000;;,
+ 58;3;1.000000,1.000000,1.000000;;,
+ 59;3;1.000000,1.000000,1.000000;;,
+ 60;3;1.000000,1.000000,1.000000;;;
+ }
+ AnimationKey {
+ 2;
+ 61;
+ 0;3;0.000000,0.000000,0.000000;;,
+ 1;3;0.000000,0.000000,0.000000;;,
+ 2;3;0.000000,0.000000,0.000000;;,
+ 3;3;0.000000,0.000000,0.000000;;,
+ 4;3;0.000000,0.000000,0.000000;;,
+ 5;3;0.000000,0.000000,0.000000;;,
+ 6;3;0.000000,0.000000,0.000000;;,
+ 7;3;0.000000,0.000000,0.000000;;,
+ 8;3;0.000000,0.000000,0.000000;;,
+ 9;3;0.000000,0.000000,0.000000;;,
+ 10;3;0.000000,0.000000,0.000000;;,
+ 11;3;0.000000,0.000000,0.000000;;,
+ 12;3;0.000000,0.000000,0.000000;;,
+ 13;3;0.000000,0.000000,0.000000;;,
+ 14;3;0.000000,0.000000,0.000000;;,
+ 15;3;0.000000,0.000000,0.000000;;,
+ 16;3;0.000000,0.000000,0.000000;;,
+ 17;3;0.000000,0.000000,0.000000;;,
+ 18;3;0.000000,0.000000,0.000000;;,
+ 19;3;0.000000,0.000000,0.000000;;,
+ 20;3;0.000000,0.000000,0.000000;;,
+ 21;3;0.000000,0.000000,0.000000;;,
+ 22;3;0.000000,0.000000,0.000000;;,
+ 23;3;0.000000,0.000000,0.000000;;,
+ 24;3;0.000000,0.000000,0.000000;;,
+ 25;3;0.000000,0.000000,0.000000;;,
+ 26;3;0.000000,0.000000,0.000000;;,
+ 27;3;0.000000,0.000000,0.000000;;,
+ 28;3;0.000000,0.000000,0.000000;;,
+ 29;3;0.000000,0.000000,0.000000;;,
+ 30;3;0.000000,0.000000,0.000000;;,
+ 31;3;0.000000,0.000000,0.000000;;,
+ 32;3;0.000000,0.000000,0.000000;;,
+ 33;3;0.000000,0.000000,0.000000;;,
+ 34;3;0.000000,0.000000,0.000000;;,
+ 35;3;0.000000,0.000000,0.000000;;,
+ 36;3;0.000000,0.000000,0.000000;;,
+ 37;3;0.000000,0.000000,0.000000;;,
+ 38;3;0.000000,0.000000,0.000000;;,
+ 39;3;0.000000,0.000000,0.000000;;,
+ 40;3;0.000000,0.000000,0.000000;;,
+ 41;3;0.000000,0.000000,0.000000;;,
+ 42;3;0.000000,0.000000,0.000000;;,
+ 43;3;0.000000,0.000000,0.000000;;,
+ 44;3;0.000000,0.000000,0.000000;;,
+ 45;3;0.000000,0.000000,0.000000;;,
+ 46;3;0.000000,0.000000,0.000000;;,
+ 47;3;0.000000,0.000000,0.000000;;,
+ 48;3;0.000000,0.000000,0.000000;;,
+ 49;3;0.000000,0.000000,0.000000;;,
+ 50;3;0.000000,0.000000,0.000000;;,
+ 51;3;0.000000,0.000000,0.000000;;,
+ 52;3;0.000000,0.000000,0.000000;;,
+ 53;3;0.000000,0.000000,0.000000;;,
+ 54;3;0.000000,0.000000,0.000000;;,
+ 55;3;0.000000,0.000000,0.000000;;,
+ 56;3;0.000000,0.000000,0.000000;;,
+ 57;3;0.000000,0.000000,0.000000;;,
+ 58;3;0.000000,0.000000,0.000000;;,
+ 59;3;0.000000,0.000000,0.000000;;,
+ 60;3;0.000000,0.000000,0.000000;;;
+ }
+ }
+}
diff --git a/Commons/GRS_WIC_Utility.h b/Commons/GRS_WIC_Utility.h
index cda938f9d807fe85d96d034ab0d5534cfcd27af0..b93bd51c529cfce6ce2abedee065ff912fcc022e 100644
--- a/Commons/GRS_WIC_Utility.h
+++ b/Commons/GRS_WIC_Utility.h
@@ -5,9 +5,12 @@
#include //for WIC
#include //for d3d12
#include //添加WTL支持 方便使用COM
+#include
+
#include "GRS_Def.h"
#include "GRS_Mem.h"
+using namespace ATL;
using namespace Microsoft;
using namespace Microsoft::WRL;
@@ -61,6 +64,8 @@ static WICConvert g_WICConvert[] =
{ GUID_WICPixelFormat2bppGray, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM
{ GUID_WICPixelFormat4bppGray, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM
+ //// 2021-06-12
+ //{ GUID_WICPixelFormat8bppGray, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM
{ GUID_WICPixelFormat16bppGrayFixedPoint, GUID_WICPixelFormat16bppGrayHalf }, // DXGI_FORMAT_R16_FLOAT
{ GUID_WICPixelFormat32bppGrayFixedPoint, GUID_WICPixelFormat32bppGrayFloat }, // DXGI_FORMAT_R32_FLOAT
@@ -137,7 +142,7 @@ __inline BOOL WICLoadImageFromFile(LPCWSTR pszTextureFile
, UINT& nTextureH
, UINT& nPicRowPitch
, BYTE*& pbImageData
- , size_t& szBufferSize )
+ , size_t& szBufferSize)
{
BOOL bRet = TRUE;
try
@@ -174,43 +179,36 @@ __inline BOOL WICLoadImageFromFile(LPCWSTR pszTextureFile
WICPixelFormatGUID wpf = {};
//获取WIC图片格式
GRS_THROW_IF_FAILED(pIWICFrame->GetPixelFormat(&wpf));
- GUID tgFormat = {};
-
- //通过第一道转换之后获取DXGI的等价格式
- if (GetTargetPixelFormat(&wpf, &tgFormat))
- {
- emTextureFormat = GetDXGIFormatFromPixelFormat(&tgFormat);
- }
-
+ // 尝试是否可以直接使用
+ emTextureFormat = GetDXGIFormatFromPixelFormat(&wpf);
+ GUID tgFormat = { wpf };
if (DXGI_FORMAT_UNKNOWN == emTextureFormat)
- {// 不支持的图片格式 目前退出了事
- // 一般 在实际的引擎当中都会提供纹理格式转换工具,
+ {// 直接不支持的图片格式 尝试一下兼容性转换
+ // 一般在实际的引擎当中都会提供纹理格式转换工具,
// 图片都需要提前转换好,所以不会出现不支持的现象
- AtlThrow(S_FALSE);
- }
-
- if (!InlineIsEqualGUID(wpf, tgFormat))
- {// 这个判断很重要,如果原WIC格式不是直接能转换为DXGI格式的图片时
- // 我们需要做的就是转换图片格式为能够直接对应DXGI格式的形式
- //创建图片格式转换器
- ComPtr pIConverter;
- GRS_THROW_IF_FAILED(pIWICFactory->CreateFormatConverter(&pIConverter));
-
- //初始化一个图片转换器,实际也就是将图片数据进行了格式转换
- GRS_THROW_IF_FAILED(pIConverter->Initialize(
- pIWICFrame.Get(), // 输入原图片数据
- tgFormat, // 指定待转换的目标格式
- WICBitmapDitherTypeNone, // 指定位图是否有调色板,现代都是真彩位图,不用调色板,所以为None
- NULL, // 指定调色板指针
- 0.f, // 指定Alpha阀值
- WICBitmapPaletteTypeCustom // 调色板类型,实际没有使用,所以指定为Custom
- ));
- // 调用QueryInterface方法获得对象的位图数据源接口
- GRS_THROW_IF_FAILED(pIConverter.As(&pIBMP));
+ //通过第一道转换之后获取DXGI的等价格式
+ if (GetTargetPixelFormat(&wpf, &tgFormat))
+ {
+ emTextureFormat = GetDXGIFormatFromPixelFormat(&tgFormat);
+ ComPtr pIConverter;
+ GRS_THROW_IF_FAILED(pIWICFactory->CreateFormatConverter(&pIConverter));
+
+ //初始化一个图片转换器,实际也就是将图片数据进行了格式转换
+ GRS_THROW_IF_FAILED(pIConverter->Initialize(
+ pIWICFrame.Get(), // 输入原图片数据
+ tgFormat, // 指定待转换的目标格式
+ WICBitmapDitherTypeNone, // 指定位图是否有调色板,现代都是真彩位图,不用调色板,所以为None
+ NULL, // 指定调色板指针
+ 0.f, // 指定Alpha阀值
+ WICBitmapPaletteTypeCustom // 调色板类型,实际没有使用,所以指定为Custom
+ ));
+ // 调用QueryInterface方法获得对象的位图数据源接口
+ GRS_THROW_IF_FAILED(pIConverter.As(&pIBMP));
+ }
}
else
{
- //图片数据格式不需要转换,直接获取其位图数据源接口
+ //获取位图数据源接口
GRS_THROW_IF_FAILED(pIWICFrame.As(&pIBMP));
}
//获得图片大小(单位:像素)
@@ -251,7 +249,7 @@ __inline BOOL WICLoadImageFromFile(LPCWSTR pszTextureFile
GRS_THROW_IF_FAILED(pIBMP->CopyPixels(nullptr
, nPicRowPitch
, static_cast(szImageBuffer)
- , pbPicData) );
+ , pbPicData));
pbImageData = pbPicData;
szBufferSize = szImageBuffer;
diff --git a/D3D12 Tutorials.sln b/D3D12 Tutorials.sln
index 72ee9ca037a65446fd68ea64447f3bbb67909e7a..007930cda916e902598160f5c1b7748fc02bac7d 100644
--- a/D3D12 Tutorials.sln
+++ b/D3D12 Tutorials.sln
@@ -55,6 +55,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "25-IBL-MultiInstance-Sphere
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "26-Normal-Map-And-Tangent-Space", "26-Normal-Map-And-Tangent-Space\26-Normal-Map-And-Tangent-Space.vcxproj", "{469021D1-DAEC-4EFB-8A1E-A148A1E4EF20}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "27-IBL-With-Material-Texture", "27-IBL-With-Material-Texture\27-IBL-With-Material-Texture.vcxproj", "{5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -377,6 +379,18 @@ Global
{469021D1-DAEC-4EFB-8A1E-A148A1E4EF20}.Release|x64.Build.0 = Release|x64
{469021D1-DAEC-4EFB-8A1E-A148A1E4EF20}.Release|x86.ActiveCfg = Release|Win32
{469021D1-DAEC-4EFB-8A1E-A148A1E4EF20}.Release|x86.Build.0 = Release|Win32
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Debug|x64.ActiveCfg = Debug|x64
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Debug|x64.Build.0 = Debug|x64
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Debug|x86.ActiveCfg = Debug|Win32
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Debug|x86.Build.0 = Debug|Win32
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Profile|x64.ActiveCfg = Debug|x64
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Profile|x64.Build.0 = Debug|x64
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Profile|x86.ActiveCfg = Debug|Win32
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Profile|x86.Build.0 = Debug|Win32
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Release|x64.ActiveCfg = Release|x64
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Release|x64.Build.0 = Release|x64
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Release|x86.ActiveCfg = Release|Win32
+ {5CB8B4F5-1BF1-475D-B0A0-83BE20E30061}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Shader/HDR_COLOR_CONV.hlsli b/Shader/0-1 HDR_COLOR_CONV.hlsli
similarity index 100%
rename from Shader/HDR_COLOR_CONV.hlsli
rename to Shader/0-1 HDR_COLOR_CONV.hlsli
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..9ee7ba90a40e93fd58264127d753da25c83b2c21
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "GRSD3D12Sample",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}