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": {} +}