diff options
Diffstat (limited to 'tools/ArtistTools/source/CoreLib/Render')
65 files changed, 12776 insertions, 0 deletions
diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.cpp new file mode 100644 index 0000000..4e261f1 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.cpp @@ -0,0 +1,31 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11Buffer.h" + +// shared path + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.h new file mode 100644 index 0000000..d9d9730 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.h @@ -0,0 +1,65 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "RenderResources.h" + +#include "d3d11.h" + +// GPU resources for texture +struct GPUBufferD3D11 : public GPUBufferResource +{ + ID3D11Buffer* m_pD3D11Resource; + +public: + static GPUBufferResource* Create(ID3D11Buffer* pResource) { + GPUBufferD3D11* pBuffer = new GPUBufferD3D11; + pBuffer->m_pD3D11Resource = pResource; + return pBuffer; + } + + static ID3D11Buffer* GetResource(GPUBufferResource* pBuffer) + { + GPUBufferD3D11* pD3D11Buffer = dynamic_cast<GPUBufferD3D11*>(pBuffer); + if (!pD3D11Buffer) + return 0; + return pD3D11Buffer->m_pD3D11Resource; + } + + ~GPUBufferD3D11() + { + Release(); + } + + void Release() + { + SAFE_RELEASE(m_pD3D11Resource); + } +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.cpp new file mode 100644 index 0000000..060a0cb --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.cpp @@ -0,0 +1,138 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11GPUProfiler.h" + +#include "D3D11RenderInterface.h" + +/////////////////////////////////////////////////////////////// +// factory function to create D3D11 GPU profiler +/* +GPUProfiler* GPUProfiler::CreateD3D11() +{ + GPUProfiler* pProfiler = new D3D11GPUProfiler; + pProfiler->Initialize(); + return pProfiler; +} +*/ +/////////////////////////////////////////////////////////////// +D3D11GPUProfiler::~D3D11GPUProfiler() +{ + Release(); +} + +/////////////////////////////////////////////////////////////// +void D3D11GPUProfiler::Initialize() +{ + ID3D11Device *pDevice = RenderInterfaceD3D11::GetDevice(); + + m_pContext = RenderInterfaceD3D11::GetDeviceContext(); + + D3D11_QUERY_DESC desc; + memset(&desc, 0, sizeof(D3D11_QUERY_DESC)); + desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT; + desc.MiscFlags = 0; + + pDevice->CreateQuery(&desc, &m_pQueryDisjoint); + + desc.Query = D3D11_QUERY_TIMESTAMP; + + for (int i = 0; i < MAX_QUERY_COUNT; i++) + { + pDevice->CreateQuery(&desc, &m_pQueryStart[i]); + pDevice->CreateQuery(&desc, &m_pQueryEnd[i]); + } + m_enable = true; +} + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +/////////////////////////////////////////////////////////////// +void D3D11GPUProfiler::Release() +{ + for (int i = 0; i < MAX_QUERY_COUNT; i++) + { + SAFE_RELEASE(m_pQueryStart[i]); + SAFE_RELEASE(m_pQueryEnd[i]); + } + + SAFE_RELEASE(m_pQueryDisjoint); +} + +/////////////////////////////////////////////////////////////// +void D3D11GPUProfiler::StartProfile(int id) +{ + if (!m_enable) return; + + ID3D11Query* pQuery = m_pQueryStart[id]; + m_pContext->End(pQuery); +} + +/////////////////////////////////////////////////////////////// +void D3D11GPUProfiler::EndProfile(int id) +{ + if (!m_enable) return; + + ID3D11Query* pQuery = m_pQueryEnd[id]; + m_pContext->End(pQuery); +} + +/////////////////////////////////////////////////////////////// +void D3D11GPUProfiler::StartFrame() +{ + if (!m_enable) return; + + m_pContext->Begin(m_pQueryDisjoint); +} + +/////////////////////////////////////////////////////////////// +void D3D11GPUProfiler::EndFrame() +{ + if (!m_enable) return; + + m_pContext->End(m_pQueryDisjoint); + + while(m_pContext->GetData(m_pQueryDisjoint, &m_disjointData, sizeof(D3D11_QUERY_DATA_TIMESTAMP_DISJOINT), 0) != S_OK); +} + +/////////////////////////////////////////////////////////////// +float D3D11GPUProfiler::GetProfileData(int id) +{ + if (!m_enable) + return 0.0f; + + UINT64 startTime = 0; + while(m_pContext->GetData(m_pQueryStart[id], &startTime, sizeof(UINT64), 0) != S_OK); + + UINT64 endTime = 0; + while(m_pContext->GetData(m_pQueryEnd[id], &endTime, sizeof(UINT64), 0) != S_OK); + + float frequency = static_cast<float>(m_disjointData.Frequency); + return (endTime - startTime) / frequency * 1000.0f; +} diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.h new file mode 100644 index 0000000..4c5b32f --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.h @@ -0,0 +1,56 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "d3d11.h" + +#include "GPUProfiler.h" + +#define MAX_QUERY_COUNT 64 +struct D3D11GPUProfiler : public GPUProfiler +{ +public: + ~D3D11GPUProfiler(); + + void Initialize(); + void Release(); + void StartProfile(int id); + void EndProfile(int id); + void StartFrame(); + void EndFrame(); + float GetProfileData(int id); + +protected: + ID3D11Query* m_pQueryDisjoint; + ID3D11Query* m_pQueryStart[MAX_QUERY_COUNT]; + ID3D11Query* m_pQueryEnd[MAX_QUERY_COUNT]; + D3D11_QUERY_DATA_TIMESTAMP_DISJOINT m_disjointData; + ID3D11DeviceContext* m_pContext; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.cpp new file mode 100644 index 0000000..71d1b7d --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.cpp @@ -0,0 +1,890 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11RenderInterface.h" + +#include "D3D11TextureResource.h" +#include "D3D11Shaders.h" +#include "D3D11Buffer.h" +#include "Nv.h" +#ifdef USE_11ON12_WRAPPER +#include "D3D11on12Wrapper.h" +#endif // USE_11ON12_WRAPPER +namespace RenderInterfaceD3D11 +{ + using namespace RenderInterface; + + ID3D11SamplerState* m_pSamplerStates[SAMPLER_TYPE_END]; + ID3D11BlendState* m_pBlendStates[BLEND_STATE_END]; + ID3D11DepthStencilState* m_pDepthStencilStates[DEPTH_STENCIL_STATE_END]; + ID3D11RasterizerState* m_pRasterizerStates[RASTERIZER_STATE_END]; + +#ifdef USE_11ON12_WRAPPER +#else + ID3D11DeviceContext* g_d3dDeviceContext = 0; + ID3D11Device* g_d3dDevice = 0; + IDXGIFactory1* g_pDXGIFactory1 = 0; + IDXGIDevice* g_dxgiDevice = 0; + IDXGIAdapter * g_pAdapter = 0; +#endif // USE_11ON12_WRAPPER + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +ID3D11DeviceContext* GetDeviceContext() +{ +#ifdef USE_11ON12_WRAPPER + return D3D11on12Wrapper::GetDeviceContext(); +#else + return g_d3dDeviceContext; +#endif // USE_11ON12_WRAPPER +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +ID3D11Device* GetDevice() +{ +#ifdef USE_11ON12_WRAPPER + return D3D11on12Wrapper::GetDevice11(); +#else + return g_d3dDevice; +#endif // USE_11ON12_WRAPPER +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +IDXGIFactory1* GetDXGIFactory() +{ +#ifdef USE_11ON12_WRAPPER + return D3D11on12Wrapper::GetDXGIFactory(); +#else + return g_pDXGIFactory1; +#endif // USE_11ON12_WRAPPER +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +IDXGIDevice* GetDXGIDevice() +{ +#ifdef USE_11ON12_WRAPPER + return nullptr; +#else + return g_dxgiDevice; +#endif // USE_11ON12_WRAPPER +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +IDXGIAdapter* GetAdapter() +{ +#ifdef USE_11ON12_WRAPPER + return D3D11on12Wrapper::GetAdapter(); +#else + return g_pAdapter; +#endif // USE_11ON12_WRAPPER +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IsNvDeviceID(UINT id) +{ + return id == 0x10DE; +} + +IDXGIAdapter* FindAdapter(IDXGIFactory* IDXGIFactory_0001, const WCHAR* targetName, bool& isNv) +{ + IDXGIAdapter* targetAdapter = nullptr; + std::vector<IDXGIAdapter*> adapters; + // check current adapter first. EnumAdapters could fail on some device + IDXGIAdapter* pAdapter = nullptr; + ID3D11Device* pD3dDevice = nullptr; + ID3D11DeviceContext* pD3dDeviceContext = nullptr; + DWORD createDeviceFlags = D3D11_CREATE_DEVICE_DEBUG; + D3D_FEATURE_LEVEL fl; + // This following code is the robust way to get all possible feature levels while handling DirectX 11.0 systems: + // please read https://blogs.msdn.microsoft.com/chuckw/2014/02/05/anatomy-of-direct3d-11-create-device/ + D3D_FEATURE_LEVEL lvl[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; + HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, + createDeviceFlags, lvl, _countof(lvl), + D3D11_SDK_VERSION, &pD3dDevice, &fl, &pD3dDeviceContext); + if (pD3dDevice) + { + IDXGIDevice* dxgiDevice = nullptr; + hr = pD3dDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)); + if (SUCCEEDED(hr)) + { + hr = dxgiDevice->GetAdapter(&pAdapter); + if (pAdapter) + { + adapters.push_back(pAdapter); + } + SAFE_RELEASE(dxgiDevice); + } + SAFE_RELEASE(pD3dDeviceContext); + SAFE_RELEASE(pD3dDevice); + } + + // Enum Adapters + unsigned int adapterNo = 0; + HRESULT hres = S_OK; + while (SUCCEEDED(hres = IDXGIFactory_0001->EnumAdapters(adapterNo, (IDXGIAdapter**)&pAdapter))) + { + adapters.push_back(pAdapter); + adapterNo++; + } + if (wcslen(targetName) != 0) + { + // find the adapter with specified name + for (int i = 0; i < adapters.size(); ++i) + { + IDXGIAdapter* pAdapter = adapters[i]; + DXGI_ADAPTER_DESC aDesc; + pAdapter->GetDesc(&aDesc); + std::wstring aName = aDesc.Description; + if (aName.find(targetName) != std::string::npos) + { + targetAdapter = pAdapter; + isNv = IsNvDeviceID(aDesc.VendorId); + } + } + } + else + { + // no name specified, find one NV adapter + for (int i = 0; i < adapters.size(); ++i) + { + IDXGIAdapter* pAdapter = adapters[i]; + DXGI_ADAPTER_DESC aDesc; + pAdapter->GetDesc(&aDesc); + std::wstring aName = aDesc.Description; + if (IsNvDeviceID(aDesc.VendorId)) + { + targetAdapter = pAdapter; + isNv = true; + } + } + } + if (targetAdapter == nullptr) + targetAdapter = adapters[0]; + for (int i = 0; i < adapters.size(); ++i) + { + IDXGIAdapter* pAdapter = adapters[i]; + if(pAdapter != targetAdapter) + { + pAdapter->Release(); + } + } + + return targetAdapter; +} + +HRESULT UseGoodGPUDevice() +{ +#ifdef USE_11ON12_WRAPPER + return S_OK; +#else + // create factory + if (g_pDXGIFactory1 == NV_NULL) + { + HRESULT hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)(&g_pDXGIFactory1)); + if (FAILED(hr)) + return hr; + } + + DWORD createDeviceFlags = D3D11_CREATE_DEVICE_SINGLETHREADED; // 0; // I changed only this line. +#ifdef _DEBUG + createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; +#endif + bool bNVAdapter = false; + WCHAR* pwName = L""; + g_pAdapter = FindAdapter(g_pDXGIFactory1, pwName, bNVAdapter); + +#ifdef _DEBUG + DXGI_ADAPTER_DESC adapterDesc; + g_pAdapter->GetDesc(&adapterDesc); + std::wstring adapterName = adapterDesc.Description; +#endif + + D3D_FEATURE_LEVEL fl; + HRESULT hr = D3D11CreateDevice(g_pAdapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, + createDeviceFlags, 0, 0, + D3D11_SDK_VERSION, &g_d3dDevice, &fl, &g_d3dDeviceContext); + + if(g_d3dDevice) + { + IDXGIDevice* dxgiDevice = nullptr; + hr = g_d3dDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)); + if (SUCCEEDED(hr)) + { + g_dxgiDevice = dxgiDevice; + return hr; + } + else + { + SAFE_RELEASE(g_d3dDevice); + SAFE_RELEASE(g_pAdapter); + SAFE_RELEASE(g_pDXGIFactory1); + } + } + return hr; +#endif // USE_11ON12_WRAPPER +} + +bool InitDevice(int deviceID) +{ +#ifdef USE_11ON12_WRAPPER + D3D11on12Wrapper::InitDevice(); +#else + if (deviceID == -1) + { + HRESULT hResult = UseGoodGPUDevice(); + if (FAILED(hResult)) + return false; + + return true; + } + + D3D_FEATURE_LEVEL featureLvl; + + // create factory + if (g_pDXGIFactory1 == NV_NULL) + { + HRESULT hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)(&g_pDXGIFactory1)); + if (FAILED(hr)) + return false; + } + + // create adapter for selected device + if (g_pAdapter == NV_NULL) + { + HRESULT hr = g_pDXGIFactory1->EnumAdapters(deviceID, &g_pAdapter); + if (FAILED(hr)) + return false; + } + + UINT deviceFlags = D3D11_CREATE_DEVICE_SINGLETHREADED; +#ifdef _DEBUG + deviceFlags |= D3D11_CREATE_DEVICE_DEBUG; +#endif + + // create device + HRESULT hResult = D3D11CreateDevice( + g_pAdapter, + D3D_DRIVER_TYPE_UNKNOWN, //D3D_DRIVER_TYPE_HARDWARE, + 0, + deviceFlags, + NV_NULL, + 0, + D3D11_SDK_VERSION, + &g_d3dDevice, + &featureLvl, + &g_d3dDeviceContext); + + if(FAILED(hResult)) + return false; +#endif // USE_11ON12_WRAPPER + + return true; +} + +////////////////////////////////////////////////////////////////////////// +bool Initialize() +{ + if (!GetDevice() || !GetDeviceContext()) + return false; + + D3D11_COMPARISON_FUNC depthFunc = D3D11_COMPARISON_LESS; + + InitializeShadersD3D11(); + InitializeRenderStates(); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +void Shutdown() +{ + DestroyShadersD3D11(); + ClearRenderStates(); + + // release d3d resources + IDXGIFactory1* pDxgiFactory = GetDXGIFactory(); + SAFE_RELEASE(pDxgiFactory); + + IDXGIAdapter* pAdapter = GetAdapter(); + SAFE_RELEASE(pAdapter); + + IDXGIDevice* pDXGIDevice = GetDXGIDevice(); + SAFE_RELEASE(pDXGIDevice); + + ID3D11DeviceContext* pContext = GetDeviceContext(); + SAFE_RELEASE(pContext); + + ID3D11Device* pDevice = GetDevice(); +#if defined(DEBUG) || defined(_DEBUG) + // output d3d leak + ID3D11Debug *d3dDebug; + HRESULT hr = pDevice->QueryInterface(__uuidof(ID3D11Debug), reinterpret_cast<void**>(&d3dDebug)); + if (SUCCEEDED(hr)) + { + hr = d3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_DETAIL); + } + if (d3dDebug != nullptr) + d3dDebug->Release(); +#endif + + SAFE_RELEASE(pDevice); +} + +////////////////////////////////////////////////////////////////////////////////////// +void InitializeRenderStates() +{ + ID3D11Device* pDevice = GetDevice(); + if (!pDevice) + return; + + ///////////////////////////////////////////////////////////////////////////////////////// + // alpha blending state descriptors + ///////////////////////////////////////////////////////////////////////////////////////// + + // alpha blending enabled + { + D3D11_BLEND_DESC desc; + desc.AlphaToCoverageEnable = false; + desc.IndependentBlendEnable = false; + + D3D11_RENDER_TARGET_BLEND_DESC &rtDesc = desc.RenderTarget[0]; + { + rtDesc.BlendEnable = true; + rtDesc.SrcBlend = D3D11_BLEND_SRC_ALPHA; + rtDesc.DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + rtDesc.BlendOp = D3D11_BLEND_OP_ADD; + rtDesc.SrcBlendAlpha = D3D11_BLEND_ZERO; + rtDesc.DestBlendAlpha = D3D11_BLEND_ONE; + rtDesc.BlendOpAlpha = D3D11_BLEND_OP_ADD; + rtDesc.RenderTargetWriteMask = 0x0f; + } + pDevice->CreateBlendState(&desc, &m_pBlendStates[BLEND_STATE_ALPHA]); + } + + // no alpha blending + { + D3D11_BLEND_DESC desc; + desc.AlphaToCoverageEnable = false; + desc.IndependentBlendEnable = false; + + D3D11_RENDER_TARGET_BLEND_DESC &rtDesc = desc.RenderTarget[0]; + { + rtDesc.BlendEnable = false; + rtDesc.SrcBlend = D3D11_BLEND_SRC_ALPHA; + rtDesc.DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + rtDesc.BlendOp = D3D11_BLEND_OP_ADD; + rtDesc.SrcBlendAlpha = D3D11_BLEND_ZERO; + rtDesc.DestBlendAlpha = D3D11_BLEND_ONE; + rtDesc.BlendOpAlpha = D3D11_BLEND_OP_ADD; + rtDesc.RenderTargetWriteMask = 0x0f; + } + pDevice->CreateBlendState(&desc, &m_pBlendStates[BLEND_STATE_NONE]); + } + + + ////////////////////////////////////////////////////////////////////////////////////////////// + // depth and stencil + /////////////////////////////////////////////////////////////////////////////////////////////// + D3D11_DEPTH_STENCIL_DESC depthTestDesc; + { + depthTestDesc.DepthEnable = true; + depthTestDesc.DepthFunc = D3D11_COMPARISON_LESS; + depthTestDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + depthTestDesc.StencilEnable = false; + depthTestDesc.StencilReadMask = 0xff; + depthTestDesc.StencilWriteMask = 0xff; + } + + pDevice->CreateDepthStencilState(&depthTestDesc, &m_pDepthStencilStates[DEPTH_STENCIL_DEPTH_TEST]); + + D3D11_DEPTH_STENCIL_DESC depthNone; + { + depthNone.DepthEnable = false; + depthNone.DepthFunc = D3D11_COMPARISON_LESS; + depthNone.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + depthNone.StencilEnable = false; + depthNone.StencilReadMask = 0xff; + depthNone.StencilWriteMask = 0xff; + } + + pDevice->CreateDepthStencilState(&depthNone, &m_pDepthStencilStates[DEPTH_STENCIL_DEPTH_NONE]); + + ////////////////////////////////////////////////////////////////////////////////////////////// + // rasterizer + /////////////////////////////////////////////////////////////////////////////////////////////// + D3D11_RASTERIZER_DESC rsDesc; + + // solid cull front + { + rsDesc.FillMode = D3D11_FILL_SOLID; + rsDesc.CullMode = D3D11_CULL_FRONT; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = true; + rsDesc.DepthBias = 10; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ScissorEnable = 0; + + pDevice->CreateRasterizerState(&rsDesc, &m_pRasterizerStates[RASTERIZER_STATE_FILL_CULL_FRONT]); + }; + + // solid cull back + { + rsDesc.FillMode = D3D11_FILL_SOLID; + rsDesc.CullMode = D3D11_CULL_BACK; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = true; + rsDesc.DepthBias = 10; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ScissorEnable = 0; + + pDevice->CreateRasterizerState(&rsDesc, &m_pRasterizerStates[RASTERIZER_STATE_FILL_CULL_BACK]); + } + + // solid cull none + { + rsDesc.FillMode = D3D11_FILL_SOLID; + rsDesc.CullMode = D3D11_CULL_NONE; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = true; + rsDesc.DepthBias = 10; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ScissorEnable = 0; + + pDevice->CreateRasterizerState(&rsDesc, &m_pRasterizerStates[RASTERIZER_STATE_FILL_CULL_NONE]); + + } + + // wireframe cull none + { + rsDesc.FillMode = D3D11_FILL_WIREFRAME; + rsDesc.CullMode = D3D11_CULL_NONE; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = 0; + rsDesc.DepthBias = 0; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ScissorEnable = 0; + }; + + pDevice->CreateRasterizerState(&rsDesc, &m_pRasterizerStates[RASTERIZER_STATE_WIRE]); + + // samplers + + D3D11_SAMPLER_DESC linearSamplerDesc[1] = { + D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT, + D3D11_TEXTURE_ADDRESS_WRAP, + D3D11_TEXTURE_ADDRESS_WRAP, + D3D11_TEXTURE_ADDRESS_WRAP, + 0.0, 0, D3D11_COMPARISON_NEVER, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, D3D11_FLOAT32_MAX, + }; + pDevice->CreateSamplerState(linearSamplerDesc, &m_pSamplerStates[SAMPLER_TYPE_LINEAR]); + + // create point clamp sampler for PCF sampling for hair + D3D11_SAMPLER_DESC pointClampSamplerDesc[1] = { + D3D11_FILTER_MIN_MAG_MIP_POINT, + D3D11_TEXTURE_ADDRESS_CLAMP, + D3D11_TEXTURE_ADDRESS_CLAMP, + D3D11_TEXTURE_ADDRESS_CLAMP, + 0.0, 0, D3D11_COMPARISON_NEVER, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, D3D11_FLOAT32_MAX, + }; + pDevice->CreateSamplerState(pointClampSamplerDesc, &m_pSamplerStates[SAMPLER_TYPE_POINTCLAMP]); +} + +////////////////////////////////////////////////////////////////////////////////////// +void ClearRenderStates() +{ + for (int i = 0; i < RASTERIZER_STATE_END; i++) + SAFE_RELEASE(m_pRasterizerStates[i]); + + for (int i = 0; i < DEPTH_STENCIL_STATE_END; i++) + SAFE_RELEASE(m_pDepthStencilStates[i]); + + for (int i = 0; i < SAMPLER_TYPE_END; i++) + SAFE_RELEASE(m_pSamplerStates[i]); + + for (int i = 0; i < BLEND_STATE_END; i++) + SAFE_RELEASE(m_pBlendStates[i]); +} + +////////////////////////////////////////////////////////////////////////////////////// +void BindVertexShaderResources( int startSlot, int numSRVs, ID3D11ShaderResourceView** ppSRVs) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->VSSetShaderResources( startSlot, numSRVs, ppSRVs); +} + +////////////////////////////////////////////////////////////////////////////////////// +void BindPixelShaderResources( int startSlot, int numSRVs, ID3D11ShaderResourceView** ppSRVs) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->PSSetShaderResources( startSlot, numSRVs, ppSRVs); +} + +////////////////////////////////////////////////////////////////////////////////////// +void BindVertexShaderResources( int startSlot, int numSRVs, GPUShaderResource** ppSRVs) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + for (int i = startSlot; i < (startSlot + numSRVs); i++) + { + ID3D11ShaderResourceView* pSRV = D3D11TextureResource::GetResource(ppSRVs[i]); + pDeviceContext->VSSetShaderResources( i, 1, &pSRV); + } +} + +////////////////////////////////////////////////////////////////////////////////////// +void BindPixelShaderResources( int startSlot, int numSRVs, GPUShaderResource** ppSRVs) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + for (int i = startSlot; i < (startSlot + numSRVs); i++) + { + ID3D11ShaderResourceView* pSRV = D3D11TextureResource::GetResource(ppSRVs[i]); + pDeviceContext->PSSetShaderResources( i, 1, &pSRV); + } +} + +////////////////////////////////////////////////////////////////////////////////////// +void ClearPixelShaderResources( int startSlot, int numSRVs) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + // clean up + ID3D11ShaderResourceView* ppSRVNull[128]; + memset(&ppSRVNull, 0, sizeof(ID3D11ShaderResourceView*)*128); + + pDeviceContext->PSSetShaderResources( startSlot, numSRVs, ppSRVNull); +} + +////////////////////////////////////////////////////////////////////////////////////// +void ClearVertexShaderResources( int startSlot, int numSRVs) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + // clean up + ID3D11ShaderResourceView* ppSRVNull[128]; + memset(&ppSRVNull, 0, sizeof(ID3D11ShaderResourceView*)*128); + + pDeviceContext->VSSetShaderResources( startSlot, numSRVs, ppSRVNull); +} + +////////////////////////////////////////////////////////////////////////////////////// +void ClearInputLayout() +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->IASetInputLayout(nullptr); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetPrimitiveTopologyTriangleStrip() +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP ); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetPrimitiveTopologyTriangleList() +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetPrimitiveTopologyLineList() +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_LINELIST ); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + ID3D11Buffer* pD3D11Buffer = GPUBufferD3D11::GetResource(pBuffer); + if (!pD3D11Buffer) + return; + + pDeviceContext->IASetVertexBuffers( 0, 1, &pD3D11Buffer, &stride, &offset ); +} + +////////////////////////////////////////////////////////////////////////////////////// +void ApplySampler(int slot, RenderInterface::SAMPLER_TYPE st) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->PSSetSamplers(slot, 1, &m_pSamplerStates[st] ); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyDepthStencilState(DEPTH_STENCIL_STATE state) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->OMSetDepthStencilState(m_pDepthStencilStates[state], 0); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyRasterizerState(RASTERIZER_STATE state) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->RSSetState(m_pRasterizerStates[state]); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyBlendState(BLEND_STATE st) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + float zerov[] = {0,0,0,0}; + + pDeviceContext->OMSetBlendState(m_pBlendStates[st], zerov, 0xffffffff); +} + +///////////////////////////////////////////////////////////////////////////////////////// +void SetViewport(const RenderInterface::Viewport& vp) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + D3D11_VIEWPORT d3dViewport; + + d3dViewport.TopLeftX = vp.TopLeftX; + d3dViewport.TopLeftY = vp.TopLeftY; + + d3dViewport.Width = vp.Width; + d3dViewport.Height = vp.Height; + + d3dViewport.MinDepth = vp.MinDepth; + d3dViewport.MaxDepth = vp.MaxDepth; + + pDeviceContext->RSSetViewports(1, &d3dViewport); +} + +///////////////////////////////////////////////////////////////////////////////////////// +void GetViewport(RenderInterface::Viewport& vp) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + UINT numViewports = 1; + D3D11_VIEWPORT d3dViewport; + pDeviceContext->RSGetViewports(&numViewports, &d3dViewport); + + vp.TopLeftX = d3dViewport.TopLeftX; + vp.TopLeftY = d3dViewport.TopLeftY; + + vp.Width = d3dViewport.Width; + vp.Height = d3dViewport.Height; + + vp.MinDepth = d3dViewport.MinDepth; + vp.MaxDepth = d3dViewport.MaxDepth; +} + +/////////////////////////////////////////////////////////////////////////////// +void Draw(unsigned int vertexCount, unsigned int startCount) +{ + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->Draw(vertexCount, startCount); +} + +/////////////////////////////////////////////////////////////////////////////// +// gpu buffer management +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +ID3D11Buffer* CreateD3D11Buffer( + D3D11_USAGE Usage, UINT ByteWidth, UINT StructureByteStride, + UINT BindFlags, UINT MiscFlags, + UINT CPUAccessFlags, void *pSysMem) +{ + ID3D11Device* pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return 0; + + D3D11_BUFFER_DESC desc; + + desc.Usage = Usage; + desc.ByteWidth = ByteWidth; + desc.StructureByteStride = StructureByteStride; + desc.BindFlags = BindFlags; + desc.MiscFlags = MiscFlags; + desc.CPUAccessFlags = CPUAccessFlags; + + D3D11_SUBRESOURCE_DATA InitData; + + InitData.pSysMem = pSysMem; + InitData.SysMemPitch = 0; + InitData.SysMemSlicePitch = 0; + + ID3D11Buffer* pBuffer = 0; + + HRESULT hr = pSysMem ? pDevice->CreateBuffer( &desc, &InitData, &pBuffer) + : pDevice->CreateBuffer( &desc, 0, &pBuffer); + + if( FAILED(hr) ) + return 0; + + return pBuffer; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +ID3D11ShaderResourceView* +CreateD3D11ShaderResourceView( + ID3D11Buffer* pBuffer, + DXGI_FORMAT Format, + D3D11_SRV_DIMENSION ViewDimension, + UINT NumElements, + UINT FirstElement = 0 + ) +{ + ID3D11Device* pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return 0; + + ID3D11ShaderResourceView* pSRV = 0; + + D3D11_SHADER_RESOURCE_VIEW_DESC desc; + { + desc.Format = Format; + desc.ViewDimension = ViewDimension; + desc.Buffer.FirstElement = FirstElement; + desc.Buffer.NumElements = NumElements; + } + + pDevice->CreateShaderResourceView( pBuffer, &desc, &pSRV); + + return pSRV; +} + +/////////////////////////////////////////////////////////////////////////////// +GPUBufferResource* CreateVertexBuffer( + unsigned int ByteWidth, void* pSysMem) +{ + ID3D11Buffer* pD3D11Buffer = CreateD3D11Buffer(D3D11_USAGE_DEFAULT, + ByteWidth, 0, D3D11_BIND_VERTEX_BUFFER, 0, 0, pSysMem); + + return GPUBufferD3D11::Create(pD3D11Buffer); +} + +/////////////////////////////////////////////////////////////////////////////// +GPUShaderResource* CreateShaderResource( unsigned int stride, unsigned int numElements, void* pSysMem) +{ + unsigned int byteWidth = numElements * stride; + + ID3D11Buffer* pBuffer = CreateD3D11Buffer( + D3D11_USAGE_DEFAULT, byteWidth, 0, + D3D11_BIND_SHADER_RESOURCE, 0, 0, pSysMem); + + // create SRV for bone indices + ID3D11ShaderResourceView* pSRV = CreateD3D11ShaderResourceView( + pBuffer, + DXGI_FORMAT_R32G32B32A32_FLOAT, + D3D11_SRV_DIMENSION_BUFFER, + numElements); + + SAFE_RELEASE(pBuffer); // dec ref count as this is not explicitly used later + + return D3D11TextureResource::Create(pSRV); +} + +/////////////////////////////////////////////////////////////////////////////// +// create read only shader resource buffer +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +void CopyToDevice( + GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth) +{ + ID3D11Buffer* pBuffer = GPUBufferD3D11::GetResource(pDevicePtr); + if (!pBuffer) + return; + + ID3D11DeviceContext* pDeviceContext = GetDeviceContext(); + if (!pDeviceContext) + return; + + pDeviceContext->UpdateSubresource(pBuffer, 0, NV_NULL, pSysMem, ByteWidth, 0); +} + +} // end namespace diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.h new file mode 100644 index 0000000..e5f3c02 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.h @@ -0,0 +1,90 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "d3d11.h" + +#include "RenderInterface.h" + +#include "RenderPlugin.h" + +#ifdef NV_ARTISTTOOLS +enum HAIR_SHADER_TYPE +{ + SHADER_TYPE_HAIR_SHADER_DEFAULT = RenderInterface::SHADER_TYPE_SIMPLE_COLOR + 1, + SHADER_TYPE_HAIR_SHADER_SHADOW, +}; +#endif + +// abstract interface to D3D calls +namespace RenderInterfaceD3D11 +{ + CORERENDER_EXPORT bool InitDevice(int deviceID); + CORERENDER_EXPORT bool Initialize(); + CORERENDER_EXPORT void Shutdown(); + + CORERENDER_EXPORT ID3D11DeviceContext* GetDeviceContext(); + CORERENDER_EXPORT ID3D11Device* GetDevice(); + IDXGIFactory1* GetDXGIFactory(); + IDXGIAdapter* GetAdapter(); + + CORERENDER_EXPORT void InitializeRenderStates(); + CORERENDER_EXPORT void ClearRenderStates(); + + CORERENDER_EXPORT void ApplySampler(int slot, RenderInterface::SAMPLER_TYPE st); + CORERENDER_EXPORT void ApplyDepthStencilState(RenderInterface::DEPTH_STENCIL_STATE st); + CORERENDER_EXPORT void ApplyRasterizerState(RenderInterface::RASTERIZER_STATE st); + CORERENDER_EXPORT void ApplyBlendState(RenderInterface::BLEND_STATE st); + + CORERENDER_EXPORT void GetViewport(RenderInterface::Viewport& vp); + CORERENDER_EXPORT void SetViewport(const RenderInterface::Viewport& vp); + + CORERENDER_EXPORT void BindVertexShaderResources( int startSlot, int numSRVs, GPUShaderResource** ppSRVs); + CORERENDER_EXPORT void BindPixelShaderResources( int startSlot, int numSRVs, GPUShaderResource** ppSRVs); + + CORERENDER_EXPORT void ClearVertexShaderResources( int startSlot, int numSRVs); + CORERENDER_EXPORT void ClearPixelShaderResources( int startSlot, int numSRVs); + + CORERENDER_EXPORT GPUBufferResource* CreateVertexBuffer( unsigned int ByteWidth, void* pSysMem); + CORERENDER_EXPORT GPUShaderResource* CreateShaderResource( unsigned int stride, unsigned int numElements, void* pSysMem ); + + CORERENDER_EXPORT void CopyToDevice(GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth); + + CORERENDER_EXPORT void ClearInputLayout(); + + CORERENDER_EXPORT void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset = 0); + + CORERENDER_EXPORT void SetPrimitiveTopologyTriangleStrip(); + CORERENDER_EXPORT void SetPrimitiveTopologyTriangleList(); + CORERENDER_EXPORT void SetPrimitiveTopologyLineList(); + + + CORERENDER_EXPORT void Draw(unsigned int vertexCount, unsigned int startCount = 0); +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.cpp new file mode 100644 index 0000000..3a4d27e --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.cpp @@ -0,0 +1,256 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#include "D3D11RenderShader.h" + +#include "D3D11RenderInterface.h" +#include "D3D11Wrapper.h" +#include "Nv.h" + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); } +#endif + +/////////////////////////////////////////////////////////////////////////////// +D3D11RenderShader::D3D11RenderShader() : + m_pVertexShader(0), + m_pPixelShader(0), + m_pInputLayout(0) +{ + for (int i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT; i++) + { + m_pParamBuffers[i] = nullptr; + } +} + +/////////////////////////////////////////////////////////////////////////////// +D3D11RenderShader::~D3D11RenderShader() +{ + SAFE_RELEASE(m_pVertexShader); + SAFE_RELEASE(m_pPixelShader); + SAFE_RELEASE(m_pInputLayout); + + for (int i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT; i++) + SAFE_RELEASE(m_pParamBuffers[i]); +} + +/////////////////////////////////////////////////////////////////////////////// +D3D11RenderShader* D3D11RenderShader::Create( + const char *name, + void* pVSBlob, size_t vsBlobSize, + void* pPSBlob, size_t psBlobSize, + UINT cbufferSize0, UINT cbufferSize1, + D3D11_INPUT_ELEMENT_DESC* pElemDesc, UINT numElements) +{ + D3D11RenderShader* pShader = new D3D11RenderShader; + + pShader->CreateVSFromBlob(pVSBlob, vsBlobSize, pElemDesc, numElements); + pShader->CreatePSFromBlob(pPSBlob, psBlobSize); + + if (cbufferSize0 > 0) + { + pShader->CreateParamBuffer(cbufferSize0, 0); + SET_D3D_DEBUG_NAME(pShader->getParamBuffer(0), name); + } + + if (cbufferSize1 > 0) + { + pShader->CreateParamBuffer(cbufferSize1, 1); + SET_D3D_DEBUG_NAME(pShader->getParamBuffer(1), name); + } + + if (pShader->getVertexShader()) + SET_D3D_DEBUG_NAME(pShader->getVertexShader(), name); + + if (pShader->getPixelShader()) + SET_D3D_DEBUG_NAME(pShader->getPixelShader(), name); + + if (pShader->getInputLayout()) + SET_D3D_DEBUG_NAME(pShader->getInputLayout(), name); + + return pShader; +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D11RenderShader::CreateVSFromBlob( + void* pBlob, size_t blobSize, + D3D11_INPUT_ELEMENT_DESC *desc, int elemCount) +{ + ID3D11Device *pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return false; + + if (!pBlob || (blobSize == 0)) + return false; + + SAFE_RELEASE(m_pVertexShader); + SAFE_RELEASE(m_pInputLayout); + + HRESULT res = pDevice->CreateVertexShader(pBlob, blobSize, NV_NULL, &m_pVertexShader); + + if(FAILED(res)) return false; + + if (desc) + { + res = pDevice->CreateInputLayout(desc, elemCount, + pBlob, blobSize, &m_pInputLayout); + + if(FAILED(res)) return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D11RenderShader::CreatePSFromBlob(void* pBlob, size_t blobSize) +{ + ID3D11Device* pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return false; + + if (!pBlob || (blobSize == 0)) + return false; + + SAFE_RELEASE(m_pPixelShader); + + HRESULT res = pDevice->CreatePixelShader(pBlob, blobSize, NV_NULL, &m_pPixelShader); + + if (FAILED(res)) + return false; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderShader::SetConstantBuffer() +{ + ID3D11DeviceContext* pContext = RenderInterfaceD3D11::GetDeviceContext(); + + //for (int i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT; i++) + for (int i = 0; i < 2; i++) + { + pContext->PSSetConstantBuffers(i, 1, &m_pParamBuffers[i]); + } +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderShader::MakeCurrent() +{ + ID3D11DeviceContext* pContext = RenderInterfaceD3D11::GetDeviceContext(); + + if (m_pInputLayout) + pContext->IASetInputLayout(m_pInputLayout); + else + pContext->IASetInputLayout(NV_NULL); + + + if (m_pVertexShader) + { + pContext->VSSetShader( m_pVertexShader, NV_NULL, 0); + if (m_pParamBuffers[0]) + pContext->VSSetConstantBuffers(0, 1, &m_pParamBuffers[0]); + } + + if (m_pPixelShader) + { + pContext->PSSetShader( m_pPixelShader, NV_NULL, 0); + if (m_pParamBuffers[0]) + pContext->PSSetConstantBuffers(0, 1, &m_pParamBuffers[0]); + if (m_pParamBuffers[1]) + pContext->PSSetConstantBuffers(1, 1, &m_pParamBuffers[1]); + } + + pContext->GSSetShader( 0, 0, 0); + pContext->DSSetShader( 0, 0, 0); + pContext->HSSetShader( 0, 0, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderShader::Disable() +{ + ID3D11DeviceContext* pContext = RenderInterfaceD3D11::GetDeviceContext(); + + pContext->IASetInputLayout(NV_NULL); + + pContext->VSSetShader( 0, NV_NULL, 0); + pContext->PSSetShader( 0, NV_NULL, 0); + pContext->GSSetShader( 0, 0, 0); + pContext->DSSetShader( 0, 0, 0); + pContext->HSSetShader( 0, 0, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D11RenderShader::CreateParamBuffer( UINT sizeBuffer, UINT slot ) +{ + ID3D11Device* pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return false; + + SAFE_RELEASE(m_pParamBuffers[slot]); + + D3D11_BUFFER_DESC Desc; + { + Desc.Usage = D3D11_USAGE_DYNAMIC; + Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + Desc.MiscFlags = 0; + Desc.ByteWidth = sizeBuffer; + } + + HRESULT hr = pDevice->CreateBuffer( &Desc, NV_NULL, &m_pParamBuffers[slot] ); + if( FAILED(hr) ) + false; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +void* D3D11RenderShader::MapParam(UINT slot) +{ + ID3D11DeviceContext* pContext = RenderInterfaceD3D11::GetDeviceContext(); + + if (!m_pParamBuffers[slot] || !pContext) + return 0; + + D3D11_MAPPED_SUBRESOURCE mappedResource; + HRESULT hr = pContext->Map(m_pParamBuffers[slot], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + + if ( FAILED(hr)) + return 0; + + return mappedResource.pData; +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderShader::UnmapParam( UINT slot ) +{ + ID3D11DeviceContext* pContext = RenderInterfaceD3D11::GetDeviceContext(); + + if (pContext && m_pParamBuffers[slot]) + pContext->Unmap( m_pParamBuffers[slot], 0); +}
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.h new file mode 100644 index 0000000..1aad045 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.h @@ -0,0 +1,72 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include <d3d11.h> +#include "RenderPlugin.h" + +class CORERENDER_EXPORT D3D11RenderShader +{ +public: + D3D11RenderShader(); + ~D3D11RenderShader(); + + static D3D11RenderShader* Create( + const char *name, + void* pVSBlob, size_t vsBlobSize, + void* pPSBlob, size_t psBlobSize, + UINT cbufferSize0 = 0, UINT cbufferSize1 = 0, + D3D11_INPUT_ELEMENT_DESC* pElemDesc = 0, UINT numElements = 0); + + void MakeCurrent(); + void Disable(); + void SetConstantBuffer(); + + void* MapParam(UINT slot = 0); + void UnmapParam(UINT slot = 0); + + ID3D11VertexShader* getVertexShader() { return m_pVertexShader; } + ID3D11PixelShader* getPixelShader() { return m_pPixelShader; } + ID3D11InputLayout* getInputLayout() { return m_pInputLayout; } + ID3D11Buffer* getParamBuffer(UINT slot = 0) { return m_pParamBuffers[slot]; } + +protected: + bool CreateVSFromBlob(void* pBlob, size_t blobSize, + D3D11_INPUT_ELEMENT_DESC *desc, int elemCount); + bool CreatePSFromBlob(void* pBlob, size_t blobSize); + bool CreateParamBuffer(UINT sizeBuffer, UINT slot = 0); + +private: + + ID3D11VertexShader* m_pVertexShader; + ID3D11PixelShader* m_pPixelShader; + ID3D11InputLayout* m_pInputLayout; + ID3D11Buffer* m_pParamBuffers[D3D11_COMMONSHADER_CONSTANT_BUFFER_HW_SLOT_COUNT]; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.cpp new file mode 100644 index 0000000..1274ed5 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.cpp @@ -0,0 +1,319 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11RendererWindow.h" + +#include "windows.h" + +#include "DXUT.h" +#include "DXUTgui.h" +#include "sdkmisc.h" + +#include "D3D11RenderInterface.h" +#include "Nv.h" +#ifdef USE_11ON12_WRAPPER +#include "D3D11on12Wrapper.h" +#endif // USE_11ON12_WRAPPER +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +/////////////////////////////////////////////////////////////////////////////// +D3D11RenderWindow::D3D11RenderWindow() : + m_sampleCount(8) + , m_sampleQuality(0) +#ifdef USE_11ON12_WRAPPER +#else + , m_pDXGISwapChain(NV_NULL) + , m_pD3D11BackBuffer(NV_NULL) + , m_pD3D11DepthBuffer(NV_NULL) + , m_pD3D11RenderTargetView(NV_NULL) + , m_pD3D11DepthStencilView(NV_NULL) +#endif // USE_11ON12_WRAPPER +{ + +} + +/////////////////////////////////////////////////////////////////////////////// +D3D11RenderWindow::~D3D11RenderWindow() +{ + Free(); +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D11RenderWindow::Create( HWND hWnd, unsigned int nSamples ) +{ +#ifdef USE_11ON12_WRAPPER +#else + if (m_pD3D11BackBuffer != NV_NULL || m_pD3D11RenderTargetView != NV_NULL) + Free(); +#endif // USE_11ON12_WRAPPER + + ID3D11Device *pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return false; + + ID3D11DeviceContext* pDeviceContext = RenderInterfaceD3D11::GetDeviceContext(); + if (!pDeviceContext) + return false; + + if(nSamples > D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT) + nSamples = D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; + + m_sampleCount = nSamples; + m_sampleQuality = 0; + if(nSamples > 1) + { + pDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, nSamples, &m_sampleQuality); + assert(m_sampleQuality > 0); + m_sampleQuality--; + } + + RECT rc; + GetClientRect((HWND)hWnd, &rc); + int wBuf = rc.right - rc.left; + int hBuf = rc.bottom- rc.top; + +#ifdef USE_11ON12_WRAPPER + D3D11on12Wrapper::InitSwapchain(wBuf, hBuf, hWnd); +#else + DXGI_SWAP_CHAIN_DESC swapChainDesc; + { + memset(&swapChainDesc, 0, sizeof(DXGI_SWAP_CHAIN_DESC)); + swapChainDesc.BufferDesc.Width = wBuf; + swapChainDesc.BufferDesc.Height= hBuf; + swapChainDesc.BufferDesc.Format= DXGI_FORMAT_R8G8B8A8_UNORM; + swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; + swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; + swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + + swapChainDesc.BufferCount = 1; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + swapChainDesc.OutputWindow = (HWND)hWnd; + swapChainDesc.SampleDesc.Count = m_sampleCount; + swapChainDesc.SampleDesc.Quality = m_sampleQuality; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + swapChainDesc.Windowed = true; + } + + // Create the swap chain + IDXGIFactory1* pDXGIFactory = RenderInterfaceD3D11::GetDXGIFactory(); + HRESULT res = pDXGIFactory->CreateSwapChain(pDevice, &swapChainDesc, &m_pDXGISwapChain); + if (FAILED(res)) return false; +#endif // USE_11ON12_WRAPPER + + // create DXUT text rendering class + m_pDialogResourceManager = new CDXUTDialogResourceManager; + m_pDialogResourceManager->OnD3D11CreateDevice(pDevice, pDeviceContext); + m_pTextHelper = new CDXUTTextHelper( pDevice, pDeviceContext, m_pDialogResourceManager, 15 ); + + CreateRenderTarget(); + Resize(wBuf, hBuf); + return true;// SUCCEEDED(res); +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderWindow::Free() +{ + FreeBuffer(); + + SAFE_DELETE(m_pTextHelper); + +#ifdef USE_11ON12_WRAPPER +#else + SAFE_RELEASE(m_pDXGISwapChain); +#endif // USE_11ON12_WRAPPER + + if (m_pDialogResourceManager) + { + m_pDialogResourceManager->OnD3D11DestroyDevice(); + SAFE_DELETE(m_pDialogResourceManager); + } +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderWindow::FreeBuffer() +{ +#ifdef USE_11ON12_WRAPPER +#else + SAFE_RELEASE(m_pD3D11RenderTargetView); + SAFE_RELEASE(m_pD3D11BackBuffer); + SAFE_RELEASE(m_pD3D11DepthStencilView); + SAFE_RELEASE(m_pD3D11DepthBuffer); +#endif // USE_11ON12_WRAPPER +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderWindow::Present() +{ +#ifdef USE_11ON12_WRAPPER + D3D11on12Wrapper::EndScene(); +#else + assert(m_pDXGISwapChain); + + if(m_pDXGISwapChain) + { + //m_pDXGISwapChain->Present(1, 0); // present in vsync + m_pDXGISwapChain->Present(0, 0); // present in vsync off + } +#endif // USE_11ON12_WRAPPER +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D11RenderWindow::Clear(float r, float g, float b) +{ +#ifdef USE_11ON12_WRAPPER + D3D11on12Wrapper::BeginScene(); + D3D11on12Wrapper::ClearScene(r, g, b); +#else + const float clearColor[4] = {r, g, b, 1.0f}; + + ID3D11DeviceContext* pD3DContext = RenderInterfaceD3D11::GetDeviceContext(); + pD3DContext->ClearRenderTargetView(m_pD3D11RenderTargetView, clearColor); + pD3DContext->ClearDepthStencilView(m_pD3D11DepthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0); +#endif // USE_11ON12_WRAPPER +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D11RenderWindow::Resize(int w, int h) +{ + assert(w > 0 && h > 0); + DXGI_SWAP_CHAIN_DESC swapChainDesc; + HRESULT res0 = m_pDXGISwapChain->GetDesc(&swapChainDesc); + if (w == (LONG)swapChainDesc.BufferDesc.Width && + h == (LONG)swapChainDesc.BufferDesc.Height) + return true; + +#ifdef USE_11ON12_WRAPPER +#else + //ID3D11DeviceContext* pD3DContext = RenderInterfaceD3D11::GetDeviceContext(); + //ID3D11RenderTargetView *nullRTV = NULL; + //pD3DContext->OMSetRenderTargets(1, &nullRTV, NULL); + FreeBuffer(); + swapChainDesc.BufferDesc.Width = w; + swapChainDesc.BufferDesc.Height = h; + //HRESULT res = m_pDXGISwapChain->ResizeBuffers(1, w, h, DXGI_FORMAT_R8G8B8A8_UNORM, 0); + HRESULT res = m_pDXGISwapChain->ResizeBuffers(swapChainDesc.BufferCount, swapChainDesc.BufferDesc.Width, + swapChainDesc.BufferDesc.Height, swapChainDesc.BufferDesc.Format, + swapChainDesc.Flags); + assert(SUCCEEDED(res)); +#endif + return CreateRenderTarget(); +} + +bool D3D11RenderWindow::CreateRenderTarget() +{ +#ifdef USE_11ON12_WRAPPER + D3D11on12Wrapper::ResizeScene(w, h); +#else + ID3D11Device* pDevice = RenderInterfaceD3D11::GetDevice(); + // Retrieve the 2D back buffer + HRESULT res = m_pDXGISwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&m_pD3D11BackBuffer); + assert(SUCCEEDED(res)); + + D3D11_TEXTURE2D_DESC descTex2D; + m_pD3D11BackBuffer->GetDesc(&descTex2D); + + // Create the render target view + D3D11_RENDER_TARGET_VIEW_DESC descRenderTargetView; + { + memset(&descRenderTargetView, 0, sizeof(D3D11_RENDER_TARGET_VIEW_DESC)); + descRenderTargetView.Format = descTex2D.Format; + descRenderTargetView.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS; // -MS dimension to support MSAA + descRenderTargetView.Texture2D.MipSlice = 0; + } + + res = pDevice->CreateRenderTargetView(m_pD3D11BackBuffer, &descRenderTargetView, &m_pD3D11RenderTargetView); + + assert(SUCCEEDED(res)); + + DXGI_SWAP_CHAIN_DESC swapChainDesc; + HRESULT res0 = m_pDXGISwapChain->GetDesc(&swapChainDesc); + // Create the depth/stencil buffer and view + D3D11_TEXTURE2D_DESC depthStencilDesc; + + depthStencilDesc.Width = swapChainDesc.BufferDesc.Width; + depthStencilDesc.Height = swapChainDesc.BufferDesc.Height; + depthStencilDesc.MipLevels = 1; + depthStencilDesc.ArraySize = 1; + depthStencilDesc.Format = DXGI_FORMAT_R24G8_TYPELESS; + depthStencilDesc.SampleDesc.Count = m_sampleCount; + depthStencilDesc.SampleDesc.Quality = m_sampleQuality; + depthStencilDesc.Usage = D3D11_USAGE_DEFAULT; + depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; + depthStencilDesc.CPUAccessFlags = 0; + depthStencilDesc.MiscFlags = 0; + + res = pDevice->CreateTexture2D(&depthStencilDesc, 0, &m_pD3D11DepthBuffer); + assert(SUCCEEDED(res)); + + D3D11_DEPTH_STENCIL_VIEW_DESC descDepthStencilView; + memset(&descDepthStencilView, 0, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC)); + descDepthStencilView.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + descDepthStencilView.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; // -MS dimension to support MSAA + descDepthStencilView.Texture2D.MipSlice = 0; + + res = pDevice->CreateDepthStencilView(m_pD3D11DepthBuffer, &descDepthStencilView, &m_pD3D11DepthStencilView); + assert(SUCCEEDED(res)); + + m_Width = swapChainDesc.BufferDesc.Width; + m_Height= swapChainDesc.BufferDesc.Height; + + ///////////////////////////////////////// + if (m_pDialogResourceManager) + { + DXGI_SURFACE_DESC backbufferDesc; + backbufferDesc.Width = descTex2D.Width; + backbufferDesc.Height = descTex2D.Height; + backbufferDesc.Format = descTex2D.Format; + backbufferDesc.SampleDesc = descTex2D.SampleDesc; + + m_pDialogResourceManager->OnD3D11ResizedSwapChain(pDevice, &backbufferDesc); + } + + // assume always the current render window, bind to render context immediately + ID3D11DeviceContext* pD3DContext = RenderInterfaceD3D11::GetDeviceContext(); + pD3DContext->OMSetRenderTargets(1, &m_pD3D11RenderTargetView, m_pD3D11DepthStencilView); + + // set the viewport transform + D3D11_VIEWPORT vp; + { + vp.TopLeftX = 0; + vp.TopLeftY = 0; + vp.Width = (float)m_Width; + vp.Height = (float)m_Height; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + } + pD3DContext->RSSetViewports(1, &vp); +#endif // USE_11ON12_WRAPPER + + return true; +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.h new file mode 100644 index 0000000..88d5c8f --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.h @@ -0,0 +1,43 @@ +#pragma once + +#include <d3d11.h> + +// DXUT stuffs for text rendering +class CDXUTDialogResourceManager; +class CDXUTTextHelper; + +struct D3D11RenderWindow +{ +public: + D3D11RenderWindow(); + ~D3D11RenderWindow(); + + bool Create(HWND hWnd, unsigned int nSamples = 1); + bool Resize(int w, int h); + void Present(); + void Clear(float r, float g, float b); + bool CreateRenderTarget(); + + // sample desc + UINT m_sampleCount; + UINT m_sampleQuality; +#ifdef USE_11ON12_WRAPPER +#else + int m_Height, m_Width; + + IDXGISwapChain* m_pDXGISwapChain; + ID3D11Texture2D* m_pD3D11BackBuffer; + ID3D11Texture2D* m_pD3D11DepthBuffer; + ID3D11RenderTargetView* m_pD3D11RenderTargetView; + ID3D11DepthStencilView* m_pD3D11DepthStencilView; +#endif // USE_11ON12_WRAPPER + + CDXUTDialogResourceManager* m_pDialogResourceManager; + CDXUTTextHelper* m_pTextHelper; + +private: + void Free(); + void FreeBuffer(); + +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.cpp new file mode 100644 index 0000000..eba1184 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.cpp @@ -0,0 +1,225 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11Shaders.h" + +#include "MeshShaderParam.h" +#include "LightShaderParam.h" + +//#include <Nv/Blast/NvHairSdk.h> +#include "D3D11RenderShader.h" + +using namespace RenderInterface; + +///////////////////////////////////////////////////////////////////////////////////// +// Common shader settings +//static D3D11RenderShader* g_pShaders[SHADER_TYPE_END]; +static std::map<int, D3D11RenderShader*> g_pShaders; +/* +namespace BodyShaderBlobs +{ + #include "Shaders/BodyShader_VS.h" + #include "Shaders/BodyShader_PS.h" +} + +namespace BodyShadowBlobs +{ + #include "Shaders/BodyShadow_VS.h" + #include "Shaders/BodyShadow_PS.h" +} + +namespace ScreenQuadBlobs +{ + #include "Shaders/ScreenQuad_VS.h" + #include "Shaders/ScreenQuad_PS.h" +} + +namespace ScreenQuadColorBlobs +{ + #include "Shaders/ScreenQuadColor_VS.h" + #include "Shaders/ScreenQuadColor_PS.h" +} + +namespace VisualizeShadowBlobs +{ + #include "Shaders/VisualizeShadow_VS.h" + #include "Shaders/VisualizeShadow_PS.h" +} + +namespace ColorBlobs +{ + #include "Shaders/Color_VS.h" + #include "Shaders/Color_PS.h" +} + +#ifndef NV_ARTISTTOOLS +namespace BlastShaderBlobs +{ +#include "Shaders/BlastShader_PS.h" +} + +namespace BlastShadowBlobs +{ +#include "Shaders/BlastShadow_PS.h" +} +#endif // NV_ARTISTTOOLS +*/ +////////////////////////////////////////////////////////////////////////// +bool InitializeShadersD3D11() +{ + /* + D3D11_INPUT_ELEMENT_DESC layoutBodyRender[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "VERTEX_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "FACE_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "VERTEX_ID", 0, DXGI_FORMAT_R32_FLOAT, 0, 56, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + + UINT numElements = sizeof(layoutBodyRender)/sizeof(D3D11_INPUT_ELEMENT_DESC); + + g_pShaders[SHADER_TYPE_MESH_RENDERING] = D3D11RenderShader::Create( "MeshRenderShader", + (void*)BodyShaderBlobs::g_vs_main, sizeof(BodyShaderBlobs::g_vs_main), + (void*)BodyShaderBlobs::g_ps_main, sizeof(BodyShaderBlobs::g_ps_main), + sizeof(MeshShaderParam), 0, + &layoutBodyRender[0], numElements); + + g_pShaders[SHADER_TYPE_MESH_SHADOW] = D3D11RenderShader::Create( "MeshShadowShader", + (void*)BodyShadowBlobs::g_vs_main, sizeof(BodyShadowBlobs::g_vs_main), + (void*)BodyShadowBlobs::g_ps_main, sizeof(BodyShadowBlobs::g_ps_main), + sizeof(MeshShadowShaderParam), 0, + &layoutBodyRender[0], numElements); + + g_pShaders[SHADER_TYPE_SCREEN_QUAD] = D3D11RenderShader::Create( "ScreenQuadShader", + (void*)ScreenQuadBlobs::g_vs_main, sizeof(ScreenQuadBlobs::g_vs_main), + (void*)ScreenQuadBlobs::g_ps_main, sizeof(ScreenQuadBlobs::g_ps_main)); + + g_pShaders[SHADER_TYPE_SCREEN_QUAD_COLOR] = D3D11RenderShader::Create( "ScreenQuadColorShader", + (void*)ScreenQuadColorBlobs::g_vs_main, sizeof(ScreenQuadColorBlobs::g_vs_main), + (void*)ScreenQuadColorBlobs::g_ps_main, sizeof(ScreenQuadColorBlobs::g_ps_main)); + + g_pShaders[SHADER_TYPE_VISUALIZE_SHADOW] = D3D11RenderShader::Create( "VisualizeShadowShader", + (void*)VisualizeShadowBlobs::g_vs_main, sizeof(VisualizeShadowBlobs::g_vs_main), + (void*)VisualizeShadowBlobs::g_ps_main, sizeof(VisualizeShadowBlobs::g_ps_main), + sizeof(ShadowVizParam)); + + D3D11_INPUT_ELEMENT_DESC layout_Position_And_Color[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + UINT numElements2 = sizeof(layout_Position_And_Color)/sizeof(D3D11_INPUT_ELEMENT_DESC); + + g_pShaders[SHADER_TYPE_SIMPLE_COLOR] = D3D11RenderShader::Create( "Color", + (void*)ColorBlobs::g_vs_main, sizeof(ColorBlobs::g_vs_main), + (void*)ColorBlobs::g_ps_main, sizeof(ColorBlobs::g_ps_main), + sizeof(SimpleShaderParam), 0, + &layout_Position_And_Color[0], numElements2); + +#ifndef NV_ARTISTTOOLS + g_pShaders[SHADER_TYPE_HAIR_SHADER_DEFAULT] = D3D11RenderShader::Create( + "hairShaderDefault", 0, 0, + (void*)BlastShaderBlobs::g_ps_main, sizeof(BlastShaderBlobs::g_ps_main), + sizeof(NvHair::ShaderConstantBuffer), + sizeof(LightShaderParam) + ); + + g_pShaders[SHADER_TYPE_HAIR_SHADER_SHADOW] = D3D11RenderShader::Create( + "hairShadow", 0, 0, + (void*)BlastShadowBlobs::g_ps_main, sizeof(BlastShadowBlobs::g_ps_main), + sizeof(NvHair::ShaderConstantBuffer), + 0); +#else + CoreLib::Inst()->D3D11Shaders_InitializeShadersD3D11(g_pShaders); +#endif // NV_ARTISTTOOLS + */ + return true; +} + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +#ifndef SAFE_DELETE +#define SAFE_DELETE(x) { if (x) delete x; x = 0; } +#endif + +/////////////////////////////////////////////////////////////////////////////// +void DestroyShadersD3D11() +{ + for (int i = 0; i < g_pShaders.size(); i++) + { + D3D11RenderShader*& pShader = g_pShaders[i]; + if (pShader) + { + delete pShader; + pShader = 0; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +D3D11RenderShader* GetShaderD3D11(SHADER_TYPE st) +{ + return g_pShaders[st]; +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyShaderD3D11(SHADER_TYPE st) +{ + D3D11RenderShader* pD3D11Shader = GetShaderD3D11(st); + if (!pD3D11Shader) + return; + + pD3D11Shader->MakeCurrent(); +} + +/////////////////////////////////////////////////////////////////////////////// +void DisableShaderD3D11(RenderInterface::SHADER_TYPE st) +{ + D3D11RenderShader* pD3D11Shader = GetShaderD3D11(st); + if (!pD3D11Shader) + return; + + pD3D11Shader->Disable(); +} + +/////////////////////////////////////////////////////////////////////////////// +void CopyShaderParamD3D11(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot) +{ + D3D11RenderShader* pD3D11Shader = GetShaderD3D11(st); + if (!pD3D11Shader) + return; + + void* mappedParam = pD3D11Shader->MapParam(slot); + + memcpy(mappedParam, pSysMem, bytes); + + pD3D11Shader->UnmapParam(slot); +}
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.h new file mode 100644 index 0000000..b1d4929 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.h @@ -0,0 +1,43 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "RenderInterface.h" + +#include "RenderPlugin.h" + +/////////////////////////////////////////////////////////////////// +// default shaders +/////////////////////////////////////////////////////////////////// +CORERENDER_EXPORT bool InitializeShadersD3D11(); +CORERENDER_EXPORT void DestroyShadersD3D11(); + +CORERENDER_EXPORT void ApplyShaderD3D11(RenderInterface::SHADER_TYPE st); +CORERENDER_EXPORT void DisableShaderD3D11(RenderInterface::SHADER_TYPE st); +CORERENDER_EXPORT void CopyShaderParamD3D11(RenderInterface::SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot = 0); diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.cpp new file mode 100644 index 0000000..90e30b2 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.cpp @@ -0,0 +1,208 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11ShadowMap.h" + +#include "RenderResources.h" + +#include "D3D11RenderInterface.h" +#include "D3D11TextureResource.h" + +namespace +{ +////////////////////////////////////////////////////////////////////////////////////////////////// +D3D11_TEXTURE2D_DESC CreateD3D11TextureDesc( + DXGI_FORMAT Format, UINT Width, UINT Height, + UINT BindFlags, UINT SampleCount = 1, D3D11_USAGE Usage = D3D11_USAGE_DEFAULT, UINT CPUAccessFlags = 0, + UINT MiscFlags = 0, UINT ArraySize = 1, UINT MipLevels = 1) +{ + + D3D11_TEXTURE2D_DESC desc; + + desc.Format = Format; + desc.Width = Width; + desc.Height = Height; + + desc.ArraySize = ArraySize; + desc.MiscFlags = MiscFlags; + desc.MipLevels = MipLevels; + + desc.SampleDesc.Count = SampleCount; + desc.SampleDesc.Quality = 0; + desc.BindFlags = BindFlags; + desc.Usage = Usage; + desc.CPUAccessFlags = CPUAccessFlags; + + return desc; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +D3D11_DEPTH_STENCIL_VIEW_DESC CreateD3D11DSVDesc( + DXGI_FORMAT Format, D3D11_DSV_DIMENSION ViewDimension, + UINT Flags = 0, UINT MipSlice = 0) +{ + D3D11_DEPTH_STENCIL_VIEW_DESC desc; + + desc.Format = Format; + desc.ViewDimension = ViewDimension; + desc.Flags = Flags; + desc.Texture2D.MipSlice = MipSlice; + + return desc; +} + +} + +////////////////////////////////////////////////////////////////////////////// +D3D11ShadowMap::D3D11ShadowMap(int resolution) +{ + m_pShadowTexture = nullptr; + m_pShadowRTV = nullptr; + m_pShadowSRV = nullptr; + + m_pDepthTexture = nullptr; + m_pDepthDSV = nullptr; + + ID3D11Device* pd3dDevice = RenderInterfaceD3D11::GetDevice(); + if (!pd3dDevice) + return; + + { + m_viewport.Width = float(resolution); + m_viewport.Height = float(resolution); + m_viewport.MinDepth = 0; + m_viewport.MaxDepth = 1; + m_viewport.TopLeftX = 0; + m_viewport.TopLeftY = 0; + } + + HRESULT hr; + + // create shadow render target + { + D3D11_TEXTURE2D_DESC texDesc = CreateD3D11TextureDesc( + DXGI_FORMAT_R32_FLOAT, UINT(m_viewport.Width), UINT(m_viewport.Height), + D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE); + + hr = pd3dDevice->CreateTexture2D( &texDesc, NULL, &m_pShadowTexture ); + hr = pd3dDevice->CreateShaderResourceView( m_pShadowTexture, NULL, &m_pShadowSRV ); + hr = pd3dDevice->CreateRenderTargetView(m_pShadowTexture, NULL, &m_pShadowRTV); + + m_shadowResource.m_pD3D11Resource = m_pShadowSRV; + } + + // create shadow depth stencil + { + D3D11_TEXTURE2D_DESC texDesc = CreateD3D11TextureDesc( + DXGI_FORMAT_R32_TYPELESS, UINT(m_viewport.Width), UINT(m_viewport.Height), + D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE); + + hr = pd3dDevice->CreateTexture2D( &texDesc, NULL, &m_pDepthTexture ); + + D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc = CreateD3D11DSVDesc( + DXGI_FORMAT_D32_FLOAT, D3D11_DSV_DIMENSION_TEXTURE2D); + + hr = pd3dDevice->CreateDepthStencilView(m_pDepthTexture, &dsvDesc, &m_pDepthDSV); + } +} + +////////////////////////////////////////////////////////////////////////////// +D3D11ShadowMap::~D3D11ShadowMap() +{ + Release(); +} + +////////////////////////////////////////////////////////////////////////////// +void D3D11ShadowMap::Release() +{ + SAFE_RELEASE(m_pShadowTexture); + SAFE_RELEASE(m_pShadowRTV); + SAFE_RELEASE(m_pShadowSRV); + SAFE_RELEASE(m_pDepthTexture); + SAFE_RELEASE(m_pDepthDSV); + + m_shadowResource.m_pD3D11Resource = 0; +} + +////////////////////////////////////////////////////////////////////////////// +GPUShaderResource* D3D11ShadowMap::GetShadowSRV() +{ + return &m_shadowResource; +} + +////////////////////////////////////////////////////////////////////////////// +bool D3D11ShadowMap::isValid() +{ + return m_pShadowTexture && m_pShadowRTV && m_pShadowSRV && m_pDepthTexture && m_pDepthDSV; +} + +////////////////////////////////////////////////////////////////////////////// +void D3D11ShadowMap::BeginRendering(float clearDepth) +{ + if (!isValid()) + return; + + ID3D11DeviceContext* pd3dContext = RenderInterfaceD3D11::GetDeviceContext(); + if (!pd3dContext) + return; + + pd3dContext->OMGetRenderTargets(1, &m_pPreviousRTV, &m_pPreviousDSV); + m_numPreviousViewports = 1; + pd3dContext->RSGetViewports(&m_numPreviousViewports, m_previousViewport); + + pd3dContext->OMSetRenderTargets( 1, &m_pShadowRTV, m_pDepthDSV); + pd3dContext->RSSetViewports(1, &m_viewport); + + float ClearColor[4] = { clearDepth, clearDepth, clearDepth, clearDepth}; + + pd3dContext->ClearRenderTargetView( m_pShadowRTV, ClearColor ); + pd3dContext->ClearDepthStencilView( m_pDepthDSV, D3D11_CLEAR_DEPTH, 1.0, 0 ); +} + +////////////////////////////////////////////////////////////////////////////// +void D3D11ShadowMap::EndRendering() +{ + if (!isValid()) + return; + + ID3D11DeviceContext* pd3dContext = RenderInterfaceD3D11::GetDeviceContext(); + if (!pd3dContext) + return; + + pd3dContext->OMSetRenderTargets(0, NULL, NULL); + + if (m_pPreviousRTV) + { + pd3dContext->OMSetRenderTargets(1, &m_pPreviousRTV, m_pPreviousDSV); + m_pPreviousRTV->Release(); + if (m_pPreviousDSV) m_pPreviousDSV->Release(); + } + + if (m_numPreviousViewports) + pd3dContext->RSSetViewports(m_numPreviousViewports, m_previousViewport); +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.h new file mode 100644 index 0000000..fc9fe79 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.h @@ -0,0 +1,72 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "ShadowMap.h" + +#include "d3d11.h" +#include "D3D11TextureResource.h" + +class GPUShaderResource; +class D3D11TextureResource; + +struct D3D11ShadowMap : public ShadowMap +{ + D3D11_VIEWPORT m_viewport; + + ID3D11Texture2D* m_pShadowTexture; + ID3D11RenderTargetView* m_pShadowRTV; + ID3D11ShaderResourceView* m_pShadowSRV; + + ID3D11Texture2D* m_pDepthTexture; + ID3D11DepthStencilView* m_pDepthDSV; + ID3D11ShaderResourceView* m_pDepthSRV; + + D3D11TextureResource m_shadowResource; + +public: + D3D11ShadowMap(int resolution ); + ~D3D11ShadowMap(); + + void Release(); + void BeginRendering(float clearDepth); + void EndRendering(); + + GPUShaderResource* GetShadowSRV(); + +protected: + + bool isValid(); + + ID3D11RenderTargetView* m_pPreviousRTV; + ID3D11DepthStencilView* m_pPreviousDSV; + UINT m_numPreviousViewports; + D3D11_VIEWPORT m_previousViewport[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.cpp new file mode 100644 index 0000000..2a8f7ee --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.cpp @@ -0,0 +1,29 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11TextureResource.h" + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.h new file mode 100644 index 0000000..91d6539 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.h @@ -0,0 +1,64 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "RenderResources.h" + +#include "d3d11.h" + +// GPU resources for texture +struct D3D11TextureResource : public GPUShaderResource +{ + ID3D11ShaderResourceView* m_pD3D11Resource; + +public: + static GPUShaderResource* Create(ID3D11ShaderResourceView* pResource) { + D3D11TextureResource* pBuffer = new D3D11TextureResource; + pBuffer->m_pD3D11Resource = pResource; + return pBuffer; + } + + static ID3D11ShaderResourceView* GetResource(GPUShaderResource* pBuffer) + { + D3D11TextureResource* pD3D11Buffer = dynamic_cast<D3D11TextureResource*>(pBuffer); + if (!pD3D11Buffer) + return 0; + return pD3D11Buffer->m_pD3D11Resource; + } + + ~D3D11TextureResource() + { + } + + void Release() + { + SAFE_RELEASE(m_pD3D11Resource); + } +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.cpp new file mode 100644 index 0000000..b13c8e3 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.cpp @@ -0,0 +1,333 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11Util.h" + +#include "D3D11Shaders.h" +#include "D3D11RenderShader.h" + +#include "D3DX10tex.h" +#include "D3DX11tex.h" + +#include "D3D11Wrapper.h" +#include "DXUT.h" +#include "DXUTgui.h" +#include "sdkmisc.h" +#include "D3D11RendererWindow.h" +#include "SimpleRenderable.h" +//#include "MeshShaderParam.h" +#include "D3D11RenderInterface.h" +#include "D3D11TextureResource.h" + +namespace D3D11Util +{ + using namespace RenderInterface; + + // D3D hook to render window + D3D11RenderWindow* g_pRenderWindow = 0; + +/////////////////////////////////////////////////////////////////////////////// +#include "../../../../../../external/stb_image/stb_image.c" + +GPUShaderResource* +CreateTextureSRV(const char* texturename) +{ + ID3D11Device* pDevice = RenderInterfaceD3D11::GetDevice(); + if (!pDevice) + return 0; + + D3DX11_IMAGE_LOAD_INFO texLoadInfo; + + texLoadInfo.MipLevels = 8; + texLoadInfo.MipFilter = D3DX10_FILTER_TRIANGLE; + texLoadInfo.Filter = D3DX10_FILTER_TRIANGLE; + + ID3D11Resource *pRes = 0; + + HRESULT hr; + D3DX11CreateTextureFromFileA(pDevice, texturename, &texLoadInfo, NULL, &pRes, &hr); + + ID3D11Texture2D* texture = NULL; + + if (!pRes) + { + // Try stb_image for .TGA + int width = 0; + int height = 0; + int numComponents = 0; + unsigned char *pSTBIRes = stbi_load(texturename, &width, &height, &numComponents, 4); + + if (!pSTBIRes) + return 0; + + const int requestedMipLevels = texLoadInfo.MipLevels; + + D3D11_SUBRESOURCE_DATA* initData = new D3D11_SUBRESOURCE_DATA[requestedMipLevels]; + ZeroMemory(initData, sizeof(D3D11_SUBRESOURCE_DATA)*requestedMipLevels); + + struct Pixel + { + unsigned char rgba[4]; + }; + + // prepare target buffer just large enough to include all the mip levels + Pixel* targets = new Pixel[width*height*2]; + + // copy the first mip level + memcpy(targets, pSTBIRes, width*height*4); + + // now it's OK to delete the original + if (pSTBIRes) + stbi_image_free(pSTBIRes); + + // current mip level width and height + int mipWidth = width; + int mipHeight = height; + + // actual mip levels + int mipLevels = 0; + + // current data + Pixel* source = targets; + Pixel* target = nullptr; + + for (int idx = 0; idx < requestedMipLevels; ++idx) + { + // set initData + initData[idx].pSysMem = source; + initData[idx].SysMemPitch = mipWidth*4; + mipLevels++; + + // skip generating mip for 1x1 + if ((mipWidth == 1) && (mipHeight == 1)) + break; + + // skip generating mip for the last level + if (idx == (requestedMipLevels-1)) + break; + + // buffer for the next mip level + target = &source[mipWidth*mipHeight]; + + const int prevWidth = mipWidth; // previous mip's width + + // generate the next mip level + mipWidth = max(1, mipWidth >> 1); + mipHeight = max(1, mipHeight >> 1); + + Pixel samples[4]; + + for (int y = 0; y < mipHeight; ++y) + { + for (int x = 0; x < mipWidth; ++x) + { + const int px = x*2; // x in previous mip + const int py = y*2; // y in previous mip + + samples[0] = source[py*prevWidth + px]; // left top + samples[1] = source[py*prevWidth + px+1]; // right top + samples[2] = source[(py+1)*prevWidth + px]; // left bottom + samples[3] = source[(py+1)*prevWidth + px+1]; // right bottom + + // for each component + for (int comp = 0; comp < 4; ++comp) + { + // do the linear box filter for lower mip level + target[y*mipWidth + x].rgba[comp] = (samples[0].rgba[comp] + samples[1].rgba[comp] + samples[2].rgba[comp] + samples[3].rgba[comp])/4; + } + } + } + + // update source + source = target; + } + + D3D11_TEXTURE2D_DESC desc; + ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC)); + desc.ArraySize = 1; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.Height = height; + desc.Width = width; + desc.MipLevels = mipLevels; + desc.MiscFlags = 0; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + + HRESULT ret = pDevice->CreateTexture2D(&desc, initData, &texture); + + delete initData; + delete targets; + + if (ret != S_OK) + return 0; + } + else + { + pRes->QueryInterface(__uuidof( ID3D11Texture2D ), (LPVOID*)&texture); + } + + D3D11_TEXTURE2D_DESC desc; + texture->GetDesc( &desc ); + + ID3D11ShaderResourceView* pTextureSRV = 0; + + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc; + ZeroMemory( &SRVDesc, sizeof(SRVDesc) ); + SRVDesc.Format = desc.Format; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MostDetailedMip = 0; + SRVDesc.Texture2D.MipLevels = desc.MipLevels; + pDevice->CreateShaderResourceView(texture, &SRVDesc, &pTextureSRV); + + if (texture) texture->Release(); + + if (pRes) + pRes->Release(); + + return D3D11TextureResource::Create(pTextureSRV); +} + + +/////////////////////////////////////////////////////////////////////////////// +bool GetDeviceInfoString(wchar_t *str) +{ + IDXGIAdapter* pAdapter = RenderInterfaceD3D11::GetAdapter(); + if (!pAdapter) + return false; + + auto adapterDescription = DXGI_ADAPTER_DESC(); + pAdapter->GetDesc(&adapterDescription); + + WCHAR* pDescStr = adapterDescription.Description; + float memInGB = float(adapterDescription.DedicatedVideoMemory) / 1e9f; + swprintf_s(str, 1000, L"%s(%.1fGb)\n", pDescStr, memInGB); + + return true; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Render window interafce +///////////////////////////////////////////////////////////////////////////////////////// +bool CreateRenderWindow(HWND hWnd, int nSamples) +{ + SAFE_DELETE(g_pRenderWindow); + + g_pRenderWindow = new D3D11RenderWindow; + return g_pRenderWindow->Create(hWnd, nSamples); +} + +D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles) +{ + deviceHandles.pAdapter = RenderInterfaceD3D11::GetAdapter(); + deviceHandles.pFactory = RenderInterfaceD3D11::GetDXGIFactory(); + deviceHandles.pDevice = RenderInterfaceD3D11::GetDevice(); + deviceHandles.pDeviceContext = RenderInterfaceD3D11::GetDeviceContext(); + + deviceHandles.pDXGISwapChain = g_pRenderWindow->m_pDXGISwapChain; + deviceHandles.pD3D11BackBuffer = g_pRenderWindow->m_pD3D11BackBuffer; + deviceHandles.pD3D11RenderTargetView = g_pRenderWindow->m_pD3D11RenderTargetView; + deviceHandles.pD3D11DepthBuffer = g_pRenderWindow->m_pD3D11DepthBuffer; + deviceHandles.pD3D11DepthStencilView = g_pRenderWindow->m_pD3D11DepthStencilView; + return deviceHandles; +} + +void DestroyRenderWindow() +{ + SAFE_DELETE(g_pRenderWindow); +} + +bool ResizeRenderWindow(int w, int h) +{ + if (!g_pRenderWindow) + return false; + + return g_pRenderWindow->Resize(w,h); +} + +void PresentRenderWindow() +{ + if (!g_pRenderWindow) + return; + + g_pRenderWindow->Present(); +} + +void ClearRenderWindow(float r, float g, float b) +{ + if (!g_pRenderWindow) + return; + + g_pRenderWindow->Clear(r,g,b); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Text draw helper functions (using DXUT) +///////////////////////////////////////////////////////////////////////////////////////// +void TxtHelperBegin() +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->Begin(); +} + +void TxtHelperEnd() +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->End(); +} + +void TxtHelperSetInsertionPos(int x, int y) +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->SetInsertionPos(x, y); +} + +void TxtHelperSetForegroundColor(float r, float g, float b, float a) +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->SetForegroundColor(DirectX::XMFLOAT4(r,g,b,a)); +} + +void TxtHelperDrawTextLine(wchar_t* str) +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->DrawTextLine(str); +} + +} // end namespace
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.h new file mode 100644 index 0000000..8a9176e --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.h @@ -0,0 +1,69 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "d3d11.h" + +#include "RenderPlugin.h" + +class GPUShaderResource; +class IDXGISwapChain; + +namespace D3D11Util +{ + /////////////////////////////////////////////////////////////////// + // render window management + /////////////////////////////////////////////////////////////////// + D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles); + bool CreateRenderWindow(HWND hWnd, int nSamples); + void DestroyRenderWindow(); + bool ResizeRenderWindow(int w, int h); + void PresentRenderWindow(); + void ClearRenderWindow(float r, float g, float b); + + /////////////////////////////////////////////////////////////////// + // background textures + bool LoadBackgroundTexture(const char* filePath); + void RenderBackgroundTexture(); + void ClearBackgroundTexture(); + GPUShaderResource* CreateTextureSRV(const char* texturename); + + /////////////////////////////////////////////////////////////////// + CORERENDER_EXPORT bool GetDeviceInfoString(wchar_t *str); + + /////////////////////////////////////////////////////////////////// + // text helpers + CORERENDER_EXPORT void TxtHelperBegin(); + CORERENDER_EXPORT void TxtHelperEnd(); + CORERENDER_EXPORT void TxtHelperSetInsertionPos(int x, int y); + CORERENDER_EXPORT void TxtHelperSetForegroundColor(float r, float g, float b, float a = 1.0f); + CORERENDER_EXPORT void TxtHelperDrawTextLine(wchar_t* str); + + +} diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.cpp new file mode 100644 index 0000000..5a117f1 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.cpp @@ -0,0 +1,33 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D11Wrapper.h" + +namespace D3DWrapper +{ + +} // end namespace
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.h new file mode 100644 index 0000000..0d752d8 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.h @@ -0,0 +1,14 @@ +#pragma once + +#include "d3d11.h" + +namespace D3DWrapper +{ + inline void SetDebugName(ID3D11DeviceChild* pResource, const char *name) + { + if (pResource) pResource->SetPrivateData( WKPDID_D3DDebugObjectName, strlen(name), name); + } +} + +#define SET_D3D_DEBUG_NAME(x, name) D3DWrapper::SetDebugName(x, name); +#define SET_D3D_DEBUG_NAME_VAR(x) D3DWrapper::SetDebugName(x, #x); diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.cpp new file mode 100644 index 0000000..93d3fdf --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.cpp @@ -0,0 +1,315 @@ +#include "RenderPluginDx11.h" + +#include "D3D11RenderInterface.h" +#include "D3D11Util.h" +#include "D3D11Shaders.h" +#include "D3D11GPUProfiler.h" +#include "D3D11ShadowMap.h" + +RenderPlugin* CreateRenderPlugin(void) +{ + return new RenderPluginDx11; +} + +RenderPluginDx11::RenderPluginDx11() +{ + m_RenderApi = "Dx11"; +} + +RenderPluginDx11::~RenderPluginDx11() +{ +} + +// interface +bool RenderPluginDx11::InitDevice(int deviceID) +{ + return RenderInterfaceD3D11::InitDevice(deviceID); +} + +bool RenderPluginDx11::Initialize() +{ + return RenderInterfaceD3D11::Initialize(); +} + +void RenderPluginDx11::Shutdown() +{ + D3D11Util::DestroyRenderWindow(); + RenderInterfaceD3D11::Shutdown(); +} + +void RenderPluginDx11::CopyToDevice(GPUBufferResource *pDevicePtr, + void* pSysMem, unsigned int ByteWidth) +{ + RenderInterfaceD3D11::CopyToDevice(pDevicePtr, pSysMem, ByteWidth); +} + +void RenderPluginDx11::ApplyDepthStencilState(DEPTH_STENCIL_STATE state) +{ + RenderInterfaceD3D11::ApplyDepthStencilState(state); +} + +void RenderPluginDx11::ApplyRasterizerState(RASTERIZER_STATE state) +{ + RenderInterfaceD3D11::ApplyRasterizerState(state); +} + +void RenderPluginDx11::ApplySampler(int slot, SAMPLER_TYPE state) +{ + RenderInterfaceD3D11::ApplySampler(slot, state); +} + +void RenderPluginDx11::ApplyBlendState(BLEND_STATE state) +{ + RenderInterfaceD3D11::ApplyBlendState(state); +} + +void RenderPluginDx11::GetViewport(Viewport& vp) +{ + RenderInterfaceD3D11::GetViewport(vp); +} + +void RenderPluginDx11::SetViewport(const Viewport& vp) +{ + RenderInterfaceD3D11::SetViewport(vp); +} + +void RenderPluginDx11::BindVertexShaderResources(int startSlot, + int numSRVs, GPUShaderResource** ppSRVs) +{ + RenderInterfaceD3D11::BindVertexShaderResources(startSlot, numSRVs, ppSRVs); +} + +void RenderPluginDx11::BindPixelShaderResources(int startSlot, + int numSRVs, GPUShaderResource** ppSRVs) +{ + RenderInterfaceD3D11::BindPixelShaderResources(startSlot, numSRVs, ppSRVs); +} + +void RenderPluginDx11::ClearVertexShaderResources(int startSlot, int numSRVs) +{ + RenderInterfaceD3D11::ClearVertexShaderResources(startSlot, numSRVs); +} + +void RenderPluginDx11::ClearPixelShaderResources(int startSlot, int numSRVs) +{ + RenderInterfaceD3D11::ClearPixelShaderResources(startSlot, numSRVs); +} + +void RenderPluginDx11::ClearInputLayout() +{ + RenderInterfaceD3D11::ClearInputLayout(); +} + +void RenderPluginDx11::SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset) +{ + RenderInterfaceD3D11::SetVertexBuffer(pBuffer, stride, offset); +} + +void RenderPluginDx11::SetPrimitiveTopologyTriangleStrip() +{ + RenderInterfaceD3D11::SetPrimitiveTopologyTriangleStrip(); +} + +void RenderPluginDx11::SetPrimitiveTopologyTriangleList() +{ + RenderInterfaceD3D11::SetPrimitiveTopologyTriangleList(); +} + +void RenderPluginDx11::SetPrimitiveTopologyLineList() +{ + RenderInterfaceD3D11::SetPrimitiveTopologyLineList(); +} + +void RenderPluginDx11::Draw(unsigned int vertexCount, unsigned int startCount) +{ + RenderInterfaceD3D11::Draw(vertexCount, startCount); +} + +GPUBufferResource* RenderPluginDx11::CreateVertexBuffer(unsigned int ByteWidth, void* pSysMem) +{ + return RenderInterfaceD3D11::CreateVertexBuffer(ByteWidth, pSysMem); +} + +GPUShaderResource* RenderPluginDx11::CreateShaderResource(unsigned int stride, + unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer) +{ + return RenderInterfaceD3D11::CreateShaderResource(stride, numElements, pSysMem); +} + +void RenderPluginDx11::ApplyForShadow(int ForShadow) +{ +} + +void RenderPluginDx11::SwitchToDX11() +{ +} + +void RenderPluginDx11::FlushDX11() +{ +} + +void RenderPluginDx11::FlushDX12() +{ +} + +void RenderPluginDx11::ApplyPrimitiveTopologyLine() +{ +} + +void RenderPluginDx11::ApplyPrimitiveTopologyTriangle() +{ +} + +void RenderPluginDx11::SubmitGpuWork() +{ +} + +void RenderPluginDx11::WaitForGpu() +{ +} + +// util +bool RenderPluginDx11::CreateRenderWindow(HWND hWnd, int nSamples) +{ + return D3D11Util::CreateRenderWindow(hWnd, nSamples); +} + +bool RenderPluginDx11::ResizeRenderWindow(int w, int h) +{ + return D3D11Util::ResizeRenderWindow(w, h); +} + +void RenderPluginDx11::PresentRenderWindow() +{ + D3D11Util::PresentRenderWindow(); +} + +void RenderPluginDx11::ClearRenderWindow(float r, float g, float b) +{ + D3D11Util::ClearRenderWindow(r, g, b); +} + +bool RenderPluginDx11::GetDeviceInfoString(wchar_t *str) +{ + return D3D11Util::GetDeviceInfoString(str); +} + +GPUShaderResource* RenderPluginDx11::CreateTextureSRV(const char* texturename) +{ + return D3D11Util::CreateTextureSRV(texturename); +} + +void RenderPluginDx11::TxtHelperBegin() +{ + D3D11Util::TxtHelperBegin(); +} + +void RenderPluginDx11::TxtHelperEnd() +{ + D3D11Util::TxtHelperEnd(); +} + +void RenderPluginDx11::TxtHelperSetInsertionPos(int x, int y) +{ + D3D11Util::TxtHelperSetInsertionPos(x, y); +} + +void RenderPluginDx11::TxtHelperSetForegroundColor(float r, float g, float b, float a) +{ + D3D11Util::TxtHelperSetForegroundColor(r, g, b, a); +} + +void RenderPluginDx11::TxtHelperDrawTextLine(wchar_t* str) +{ + D3D11Util::TxtHelperDrawTextLine(str); +} + +// shader +bool RenderPluginDx11::InitializeShaders() +{ + return InitializeShadersD3D11(); +} + +void RenderPluginDx11::DestroyShaders() +{ + DestroyShadersD3D11(); +} + +void RenderPluginDx11::ApplyShader(SHADER_TYPE st) +{ + ApplyShaderD3D11(st); +} + +void RenderPluginDx11::DisableShader(SHADER_TYPE st) +{ + DisableShaderD3D11(st); +} + +void RenderPluginDx11::BindShaderResources(SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs) +{ +} + +void RenderPluginDx11::CopyShaderParam(SHADER_TYPE st, + void* pSysMem, unsigned int bytes, unsigned int slot) +{ + CopyShaderParamD3D11(st, pSysMem, bytes, slot); +} + +// GPUProfiler +GPUProfiler* RenderPluginDx11::CreateGPUProfiler() +{ + GPUProfiler* pProfiler = new D3D11GPUProfiler; + pProfiler->Initialize(); + return pProfiler; +} + +// ShadowMap +ShadowMap* RenderPluginDx11::CreateShadowMap(int resolution) +{ + return new D3D11ShadowMap(resolution); +} + +// D3D12RenderContext +void RenderPluginDx11::PreRender() +{ +} + +void RenderPluginDx11::PostRender() +{ +} + +// GPUMeshResources + +#include "MeshData.h" +#include "AnimUtil.h" + +GPUMeshResources* RenderPluginDx11::GPUMeshResourcesCreate(MeshData* pMeshData, const SkinData& skinData) +{ + GPUMeshResources* resources = new GPUMeshResources; + + int numIndices = pMeshData->m_NumIndices; + int numVertices = pMeshData->m_NumVertices; + + resources->m_pVertexBuffer = CreateVertexBuffer( + sizeof(MeshData::MeshVertex) * numIndices, pMeshData->m_pMeshVertices); + + resources->m_pBoneIndicesSRV = CreateShaderResource( + sizeof(atcore_float4), numVertices, skinData.m_pBoneIndices); + + resources->m_pBoneWeightsSRV = CreateShaderResource( + sizeof(atcore_float4), numVertices, skinData.m_pBoneWeights); + + return resources; +} + +void RenderPluginDx11::GPUMeshResourcesRelease(GPUMeshResources* pResource) +{ + SAFE_RELEASE(pResource->m_pVertexBuffer); + SAFE_RELEASE(pResource->m_pBoneIndicesSRV); + SAFE_RELEASE(pResource->m_pBoneWeightsSRV); +} + +D3DHandles& RenderPluginDx11::GetDeviceHandles(D3DHandles& deviceHandles) +{ + return D3D11Util::GetDeviceHandles(deviceHandles); +} diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.h b/tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.h new file mode 100644 index 0000000..a43eb94 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.h @@ -0,0 +1,83 @@ +#pragma once + +#include "RenderPlugin.h" + +extern "C" CORERENDER_EXPORT RenderPlugin* CreateRenderPlugin(void); + +class CORERENDER_EXPORT RenderPluginDx11 : public RenderPlugin +{ +public: + RenderPluginDx11(); + ~RenderPluginDx11(); + + // interface + virtual bool InitDevice(int deviceID); + virtual bool Initialize(); + virtual void Shutdown(); + virtual void CopyToDevice(GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth); + virtual void ApplyDepthStencilState(DEPTH_STENCIL_STATE state); + virtual void ApplyRasterizerState(RASTERIZER_STATE state); + virtual void ApplySampler(int slot, SAMPLER_TYPE st); + virtual void ApplyBlendState(BLEND_STATE st); + virtual void GetViewport(Viewport& vp); + virtual void SetViewport(const Viewport& vp); + virtual void BindVertexShaderResources(int startSlot, int numSRVs, GPUShaderResource** ppSRVs); + virtual void BindPixelShaderResources(int startSlot, int numSRVs, GPUShaderResource** ppSRVs); + virtual void ClearVertexShaderResources(int startSlot, int numSRVs); + virtual void ClearPixelShaderResources(int startSlot, int numSRVs); + virtual void ClearInputLayout(); + virtual void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset = 0); + virtual void SetPrimitiveTopologyTriangleStrip(); + virtual void SetPrimitiveTopologyTriangleList(); + virtual void SetPrimitiveTopologyLineList(); + virtual void Draw(unsigned int vertexCount, unsigned int startCount = 0); + virtual GPUBufferResource* CreateVertexBuffer(unsigned int ByteWidth, void* pSysMem = 0); + virtual GPUShaderResource* CreateShaderResource(unsigned int stride, unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer = NULL); + virtual void ApplyForShadow(int ForShadow); + virtual void SwitchToDX11(); + virtual void FlushDX11(); + virtual void FlushDX12(); + virtual void ApplyPrimitiveTopologyLine(); + virtual void ApplyPrimitiveTopologyTriangle(); + virtual void SubmitGpuWork(); + virtual void WaitForGpu(); + + // util + virtual bool CreateRenderWindow(HWND hWnd, int nSamples); + virtual bool ResizeRenderWindow(int w, int h); + virtual void PresentRenderWindow(); + virtual void ClearRenderWindow(float r, float g, float b); + virtual bool GetDeviceInfoString(wchar_t *str); + virtual GPUShaderResource* CreateTextureSRV(const char* texturename); + virtual void TxtHelperBegin(); + virtual void TxtHelperEnd(); + virtual void TxtHelperSetInsertionPos(int x, int y); + virtual void TxtHelperSetForegroundColor(float r, float g, float b, float a = 1.0f); + virtual void TxtHelperDrawTextLine(wchar_t* str); + + // shader + virtual bool InitializeShaders(); + virtual void DestroyShaders(); + virtual void ApplyShader(SHADER_TYPE st); + virtual void DisableShader(SHADER_TYPE st); + virtual void BindShaderResources(SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs); + virtual void CopyShaderParam(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot = 0); + + // GPUProfiler + virtual GPUProfiler* CreateGPUProfiler(); + + // ShadowMap + virtual ShadowMap* CreateShadowMap(int resolution); + + // D3D12RenderContext + virtual void PreRender(); + virtual void PostRender(); + + // GPUMeshResources + virtual GPUMeshResources* GPUMeshResourcesCreate(MeshData* pMeshData, const SkinData& skinData); + virtual void GPUMeshResourcesRelease(GPUMeshResources* pResource); + + // Get devices related + virtual D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles); +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.cpp new file mode 100644 index 0000000..0421792 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.cpp @@ -0,0 +1,31 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12Buffer.h" + +// shared path + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.h new file mode 100644 index 0000000..ccf636b --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.h @@ -0,0 +1,81 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "RenderResources.h" + +#include <d3d12.h> + +// GPU resources for texture +struct GPUBufferD3D12 : public GPUBufferResource +{ + ID3D12Resource* m_pBuffer; + UINT m_pBufferSize; + + D3D12_VERTEX_BUFFER_VIEW m_vertexBufferView; + +public: + static GPUBufferResource* Create(ID3D12Resource* pResource, int nSize) { + GPUBufferD3D12* pBuffer = new GPUBufferD3D12; + pBuffer->m_pBuffer = pResource; + pBuffer->m_pBufferSize = nSize; + return pBuffer; + } + + static ID3D12Resource* GetResource(GPUBufferResource* pBuffer) + { + GPUBufferD3D12* pD3D12Buffer = dynamic_cast<GPUBufferD3D12*>(pBuffer); + if (!pD3D12Buffer) + return 0; + return pD3D12Buffer->m_pBuffer; + } + + static D3D12_VERTEX_BUFFER_VIEW* GetVertexView(GPUBufferResource* pBuffer) + { + GPUBufferD3D12* pD3D12Buffer = dynamic_cast<GPUBufferD3D12*>(pBuffer); + if (!pD3D12Buffer) + return 0; + + pD3D12Buffer->m_vertexBufferView.BufferLocation = pD3D12Buffer->m_pBuffer->GetGPUVirtualAddress(); + pD3D12Buffer->m_vertexBufferView.StrideInBytes = 0; + pD3D12Buffer->m_vertexBufferView.SizeInBytes = pD3D12Buffer->m_pBufferSize; + return &pD3D12Buffer->m_vertexBufferView; + } + + ~GPUBufferD3D12() + { + Release(); + } + + void Release() + { + SAFE_RELEASE(m_pBuffer); + } +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.cpp new file mode 100644 index 0000000..b434c3c --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.cpp @@ -0,0 +1,222 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12GPUProfiler.h" + +#include "D3D12RenderInterface.h" +#include "D3D12RenderContext.h" +/////////////////////////////////////////////////////////////// +// factory function to create D3D12 GPU profiler +/* +GPUProfiler* GPUProfiler::CreateD3D12() +{ + GPUProfiler* pProfiler = new D3D12GPUProfiler; + pProfiler->Initialize(); + return pProfiler; +} +*/ + +/////////////////////////////////////////////////////////////// +D3D12GPUProfiler::~D3D12GPUProfiler() +{ + Release(); +} + +/////////////////////////////////////////////////////////////// +void D3D12GPUProfiler::Initialize() +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + + /* + ID3D12Device* pDevice12 = pContext->GetDevice(); + + D3D12_QUERY_HEAP_DESC queryHeapDesc = {}; + queryHeapDesc.Count = MAX_QUERY_COUNT * 2; + queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP; + ThrowIfFailed(pDevice12->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&query_heap))); + + D3D12_HEAP_PROPERTIES heap_prop; + heap_prop.Type = D3D12_HEAP_TYPE_DEFAULT; + heap_prop.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heap_prop.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + heap_prop.CreationNodeMask = 0; + heap_prop.VisibleNodeMask = 0; + + D3D12_RESOURCE_DESC res_desc; + res_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + res_desc.Alignment = 0; + res_desc.Width = sizeof(UINT64) * 2; + res_desc.Height = 1; + res_desc.DepthOrArraySize = 1; + res_desc.MipLevels = 1; + res_desc.Format = DXGI_FORMAT_UNKNOWN; + res_desc.SampleDesc.Count = 1; + res_desc.SampleDesc.Quality = 0; + res_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + res_desc.Flags = D3D12_RESOURCE_FLAG_NONE; + + ThrowIfFailed(pDevice12->CreateCommittedResource(&heap_prop, D3D12_HEAP_FLAG_NONE, + &res_desc, D3D12_RESOURCE_STATE_COMMON, nullptr, + IID_ID3D12Resource, reinterpret_cast<void**>(&query_result))); + + heap_prop.Type = D3D12_HEAP_TYPE_READBACK; + ThrowIfFailed(pDevice12->CreateCommittedResource(&heap_prop, D3D12_HEAP_FLAG_NONE, + &res_desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, + IID_ID3D12Resource, reinterpret_cast<void**>(&query_result_readback))); + */ + + m_pContext = pContext->GetDeviceContext(); + + D3D11_QUERY_DESC desc; + memset(&desc, 0, sizeof(D3D11_QUERY_DESC)); + desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT; + desc.MiscFlags = 0; + + ID3D11Device* pDevice = pContext->GetDevice11(); + pDevice->CreateQuery(&desc, &m_pQueryDisjoint); + + desc.Query = D3D11_QUERY_TIMESTAMP; + + for (int i = 0; i < MAX_QUERY_COUNT; i++) + { + pDevice->CreateQuery(&desc, &m_pQueryStart[i]); + pDevice->CreateQuery(&desc, &m_pQueryEnd[i]); + } + m_enable = true; +} + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +/////////////////////////////////////////////////////////////// +void D3D12GPUProfiler::Release() +{ + for (int i = 0; i < MAX_QUERY_COUNT; i++) + { + SAFE_RELEASE(m_pQueryStart[i]); + SAFE_RELEASE(m_pQueryEnd[i]); + } + + SAFE_RELEASE(m_pQueryDisjoint); +} + +/////////////////////////////////////////////////////////////// +void D3D12GPUProfiler::StartProfile(int id) +{ + if (!m_enable) return; + + /* + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + ID3D12GraphicsCommandList* pCommandList = pContext->GetGraphicsCommandList(); + pCommandList->EndQuery(query_heap, D3D12_QUERY_TYPE_TIMESTAMP, id * 2); + */ + + ID3D11Query* pQuery = m_pQueryStart[id]; + m_pContext->End(pQuery); +} + +/////////////////////////////////////////////////////////////// +void D3D12GPUProfiler::EndProfile(int id) +{ + if (!m_enable) return; + + /* + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + ID3D12GraphicsCommandList* pCommandList = pContext->GetGraphicsCommandList(); + pCommandList->EndQuery(query_heap, D3D12_QUERY_TYPE_TIMESTAMP, id * 2 + 1); + */ + + ID3D11Query* pQuery = m_pQueryEnd[id]; + m_pContext->End(pQuery); +} + +/////////////////////////////////////////////////////////////// +void D3D12GPUProfiler::StartFrame() +{ + if (!m_enable) return; + + m_pContext->Begin(m_pQueryDisjoint); +} + +/////////////////////////////////////////////////////////////// +void D3D12GPUProfiler::EndFrame() +{ + if (!m_enable) return; + + m_pContext->End(m_pQueryDisjoint); + + while(m_pContext->GetData(m_pQueryDisjoint, &m_disjointData, sizeof(D3D11_QUERY_DATA_TIMESTAMP_DISJOINT), 0) != S_OK); +} + +/////////////////////////////////////////////////////////////// +float D3D12GPUProfiler::GetProfileData(int id) +{ + if (!m_enable) + return 0.0f; + + /* + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + ID3D12GraphicsCommandList* pCommandList = pContext->GetGraphicsCommandList(); + + UINT64 times[2]; + D3D12_RESOURCE_BARRIER barrier; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = query_result; + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; + barrier.Transition.Subresource = 0; + pCommandList->ResourceBarrier(1, &barrier); + + pCommandList->ResolveQueryData(query_heap, D3D12_QUERY_TYPE_TIMESTAMP, id * 2, 2, query_result, 0); + + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; + pCommandList->ResourceBarrier(1, &barrier); + + pCommandList->CopyResource(query_result_readback, query_result); + + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_SOURCE; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COMMON; + pCommandList->ResourceBarrier(1, &barrier); + + void* pData; + ThrowIfFailed(query_result_readback->Map(0, 0, &pData)); + memcpy(times, pData, sizeof(UINT64) * 2); + query_result_readback->Unmap(0, 0); + */ + + UINT64 startTime = 0; + while(m_pContext->GetData(m_pQueryStart[id], &startTime, sizeof(UINT64), 0) != S_OK); + + UINT64 endTime = 0; + while(m_pContext->GetData(m_pQueryEnd[id], &endTime, sizeof(UINT64), 0) != S_OK); + + float frequency = static_cast<float>(m_disjointData.Frequency); + return (endTime - startTime) / frequency * 1000.0f; +} diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.h new file mode 100644 index 0000000..721b8a9 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.h @@ -0,0 +1,63 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include <d3d11.h> +/* +#include <d3d12.h> +*/ +#include "GPUProfiler.h" + +#define MAX_QUERY_COUNT 64 +struct D3D12GPUProfiler : public GPUProfiler +{ +public: + ~D3D12GPUProfiler(); + + void Initialize(); + void Release(); + void StartProfile(int id); + void EndProfile(int id); + void StartFrame(); + void EndFrame(); + float GetProfileData(int id); + +protected: + ID3D11Query* m_pQueryDisjoint; + ID3D11Query* m_pQueryStart[MAX_QUERY_COUNT]; + ID3D11Query* m_pQueryEnd[MAX_QUERY_COUNT]; + D3D11_QUERY_DATA_TIMESTAMP_DISJOINT m_disjointData; + ID3D11DeviceContext* m_pContext; + /* + ID3D12QueryHeap* query_heap; + ID3D12Resource* query_result; + ID3D12Resource* query_result_readback; + */ +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.cpp new file mode 100644 index 0000000..8202139 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.cpp @@ -0,0 +1,564 @@ +#include "D3D12RenderContext.h" + +const int nBufferCount = 2; +//const int nBufferCount = 5; + +int nRenderTargetIndex = 1; +//int nRenderTargetIndex = 4; + +D3D12RenderContext::D3D12RenderContext() +{ + m_sampleCount = 1; +} + +D3D12RenderContext::~D3D12RenderContext() +{ +} + +D3D12RenderContext* D3D12RenderContext::Instance() +{ + static D3D12RenderContext ri; + return &ri; +} + +void GetHardwareAdapter(IDXGIFactory2* pFactory, IDXGIAdapter1** ppAdapter) +{ + IDXGIAdapter1* pAdapter = nullptr; + *ppAdapter = nullptr; + + for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != pFactory->EnumAdapters1(adapterIndex, &pAdapter); ++adapterIndex) + { + DXGI_ADAPTER_DESC1 desc; + pAdapter->GetDesc1(&desc); + + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) + { + // Don't select the Basic Render Driver adapter. + // If you want a software adapter, pass in "/warp" on the command line. + continue; + } + + // Check to see if the adapter supports Direct3D 12, but don't create the + // actual device yet. + if (SUCCEEDED(D3D12CreateDevice(pAdapter, D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) + { + break; + } + } + + *ppAdapter = pAdapter; +} + +void D3D12RenderContext::InitDevice() +{ + UINT d3d11DeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; +#if defined(_DEBUG) + // Enable the D3D11 debug layer. + d3d11DeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + // Enable the D3D12 debug layer. + { + ComPtr<ID3D12Debug> debugController; + if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) + { + debugController->EnableDebugLayer(); + } + } +#endif + + ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&m_factory))); + + GetHardwareAdapter(m_factory.Get(), &m_adapter); + + auto adapterDescription = DXGI_ADAPTER_DESC(); + m_adapter->GetDesc(&adapterDescription); + + D3D12CreateDevice(m_adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&m_device)); + if (nullptr == m_device) + { + ComPtr<IDXGIAdapter> warpAdapter; + ThrowIfFailed(m_factory->EnumWarpAdapter(IID_PPV_ARGS(&warpAdapter))); + ThrowIfFailed(D3D12CreateDevice(warpAdapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&m_device))); + } + + // Describe and create the command queue. + D3D12_COMMAND_QUEUE_DESC queueDesc = {}; + queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + + ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue))); + + ThrowIfFailed(D3D11On12CreateDevice( + m_device.Get(), + d3d11DeviceFlags, nullptr, 0, + reinterpret_cast<IUnknown**>(m_commandQueue.GetAddressOf()), 1, 0, + &m_d3d11Device, + &m_d3d11DeviceContext, + nullptr )); + + ThrowIfFailed(m_d3d11Device.As(&m_d3d11On12Device)); +} + +void D3D12RenderContext::InitSwapchain(int nWidth, int nHeight, HWND hWnd) +{ + // Describe and create the swap chain. + DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; + swapChainDesc.BufferCount = nBufferCount; + swapChainDesc.BufferDesc.Width = nWidth; + swapChainDesc.BufferDesc.Height = nHeight; + swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + swapChainDesc.OutputWindow = hWnd; + swapChainDesc.SampleDesc.Count = 1; + swapChainDesc.Windowed = TRUE; + + ComPtr<IDXGISwapChain> swapChain; + ThrowIfFailed(m_factory->CreateSwapChain( + m_commandQueue.Get(), // Swap chain needs the queue so that it can force a flush on it. + &swapChainDesc, + &swapChain + )); + + ThrowIfFailed(swapChain.As(&m_swapChain)); + + // This sample does not support fullscreen transitions. + // ThrowIfFailed(m_factory->MakeWindowAssociation(hWnd, DXGI_MWA_NO_ALT_ENTER)); + + m_frameIndex = m_swapChain->GetCurrentBackBufferIndex(); + + ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator))); + + // Create the command list. + ThrowIfFailed(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_commandAllocator.Get(), nullptr, IID_PPV_ARGS(&m_commandList))); + + m_pCurrentRenderTarget = new D3D12RenderTarget(0, nBufferCount); + m_pCurrentRenderTarget->OnCreate(nWidth, nHeight); + m_pCurrentRenderTarget->SetClearColor(0.5, 0.5, 0.5); + m_RenderTargetMap[0] = m_pCurrentRenderTarget; + + m_pD3D11RenderTargetView = new ID3D11RenderTargetView*[nBufferCount]; + m_wrappedBackBuffers = new ID3D11Resource*[nBufferCount]; + for (int n = 0; n < nBufferCount; n++) + { + m_pD3D11RenderTargetView[n] = nullptr; + m_wrappedBackBuffers[n] = nullptr; + } + + PostCreate(); +} + +#ifndef Safe_Release +#define Safe_Release(p) { if (p) { p->Release(); (p) = nullptr; } } +#endif // !Safe_Delete + +void D3D12RenderContext::ResizeSwapchain(int width, int height) +{ + D3D12RenderTarget* rt = m_RenderTargetMap[0]; + + for (int n = 0; n < nBufferCount; n++) + { + Safe_Release(m_pD3D11RenderTargetView[n]); + Safe_Release(m_wrappedBackBuffers[n]); + } + m_d3d11DeviceContext->Flush(); + + rt->OnDestroy(); + + ThrowIfFailed(m_swapChain->ResizeBuffers(nBufferCount, width, height, DXGI_FORMAT_R8G8B8A8_UNORM, 0)); + + m_frameIndex = m_swapChain->GetCurrentBackBufferIndex(); + + rt->OnResize(width, height); + + for (int n = 0; n < nBufferCount; n++) + { + ID3D11On12Device* pDevice11On12 = GetDevice11On12(); + + D3D11_RESOURCE_FLAGS d3d11Flags = { D3D11_BIND_RENDER_TARGET }; + ThrowIfFailed(pDevice11On12->CreateWrappedResource( + rt->GetTexture(n, false), + &d3d11Flags, + D3D12_RESOURCE_STATE_RENDER_TARGET, + D3D12_RESOURCE_STATE_PRESENT, + IID_PPV_ARGS(&m_wrappedBackBuffers[n]))); + + ThrowIfFailed(m_d3d11Device->CreateRenderTargetView(m_wrappedBackBuffers[n], + NULL, &m_pD3D11RenderTargetView[n])); + } +} + +void D3D12RenderContext::PostCreate() +{ + m_srvUavHeap.Init(m_device.Get(), 256, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, D3D12_DESCRIPTOR_HEAP_FLAG_NONE); + + { + ThrowIfFailed(m_commandList->Close()); + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + } + + { + ThrowIfFailed(m_device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&m_fence))); + m_fenceValue = 1; + + // Create an event handle to use for frame synchronization. + m_fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (m_fenceEvent == nullptr) + { + ThrowIfFailed(HRESULT_FROM_WIN32(GetLastError())); + } + + WaitForGpu(); + } +} + +void D3D12RenderContext::OnDestroy() +{ + WaitForGpu(); + if (nullptr != m_fenceEvent) + { + CloseHandle(m_fenceEvent); + m_fenceEvent = nullptr; + } + +#if 0 + ID3D12DebugDevice* debugInterface; + if (SUCCEEDED(m_device.Get()->QueryInterface(&debugInterface))) + { + debugInterface->ReportLiveDeviceObjects(D3D12_RLDO_DETAIL | D3D12_RLDO_IGNORE_INTERNAL); + debugInterface->Release(); + } +#endif // 0 +} + +void D3D12RenderContext::PreRender() +{ + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); +} + +void D3D12RenderContext::PostRender() +{ + ThrowIfFailed(m_commandList->Close()); + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + OnGpuWorkSubmitted(m_commandQueue.Get()); + + WaitForGpu(); +} + +void D3D12RenderContext::SubmitGpuWork() +{ + ThrowIfFailed(m_commandList->Close()); + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + OnGpuWorkSubmitted(m_commandQueue.Get()); +} + + +void D3D12RenderContext::Flush() +{ + m_pCurrentRenderTarget->PostRender(); + PostRender(); + PreRender(); + m_pCurrentRenderTarget->PreRender(); +} + +void D3D12RenderContext::Present() +{ + ThrowIfFailed(m_swapChain->Present(1, 0)); + //ThrowIfFailed(m_swapChain->Present(0, 0)); + m_frameIndex = m_swapChain->GetCurrentBackBufferIndex(); + + //OnGpuWorkSubmitted(m_commandQueue.Get(), true); + //WaitForGpu(); +} + +int D3D12RenderContext::AllocRenderTargetIndex() +{ + return nRenderTargetIndex++; +} + + +void D3D12RenderContext::AddGpuInterface(GpuInterface* gpuIntf) +{ + m_gpuInterfaces.push_back(gpuIntf); +} + + +void D3D12RenderContext::OnGpuWorkSubmitted(ID3D12CommandQueue* queue) +{ + std::vector<GpuInterface*>::const_iterator cur = m_gpuInterfaces.begin(); + std::vector<GpuInterface*>::const_iterator end = m_gpuInterfaces.end(); + + for (; cur != end; cur++) + { + (*cur)->onGpuWorkSubmitted(queue); + } +} + +void D3D12RenderContext::UpdateGpuWorkCompleted() +{ + std::vector<GpuInterface*>::const_iterator cur = m_gpuInterfaces.begin(); + std::vector<GpuInterface*>::const_iterator end = m_gpuInterfaces.end(); + + for (; cur != end; cur++) + { + (*cur)->updateGpuWorkCompleted(); + } +} + +D3D12RenderTarget* D3D12RenderContext::CreateRenderTarget(int renderTargetIndex, int nWidth, int nHeight) +{ + D3D12RenderTarget* pRenderTarget = new D3D12RenderTarget(renderTargetIndex); + pRenderTarget->OnCreate(nWidth, nHeight); + m_RenderTargetMap[renderTargetIndex] = pRenderTarget; + return pRenderTarget; +} + +ID3D12Resource* D3D12RenderContext::GetTexture(int renderTargetIndex, int index) +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[renderTargetIndex]; + ID3D12Resource* pTexture = pRenderTarget->GetTexture(index); + return pTexture; +} + +void D3D12RenderContext::SetViewport(D3D12_VIEWPORT& vp) +{ + m_pCurrentRenderTarget->m_viewport = vp; + m_commandList->RSSetViewports(1, &vp); +} + +void D3D12RenderContext::GetViewport(D3D12_VIEWPORT& vp) +{ + vp = m_pCurrentRenderTarget->m_viewport; +} + +D3D12_RESOURCE_DESC D3D12RenderContext::GetBackBufferDesc() +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[0]; + ID3D12Resource* pResource = pRenderTarget->GetTexture(); + return pResource->GetDesc(); +} + +void D3D12RenderContext::SwitchToDX11() +{ + ReleaseRenderTarget(); + PostRender(); + + if (nullptr == m_wrappedBackBuffers[m_frameIndex]) + { + return; + } + + m_d3d11On12Device->AcquireWrappedResources(&m_wrappedBackBuffers[m_frameIndex], 1); + + m_d3d11DeviceContext->OMSetRenderTargets(1, &m_pD3D11RenderTargetView[m_frameIndex], nullptr); + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[0]; + D3D11_VIEWPORT vp; + { + vp.TopLeftX = 0; + vp.TopLeftY = 0; + vp.Width = (float)pRenderTarget->m_viewport.Width; + vp.Height = (float)pRenderTarget->m_viewport.Height; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + } + m_d3d11DeviceContext->RSSetViewports(1, &vp); +} + +void D3D12RenderContext::FlushDX11() +{ + if (nullptr == m_wrappedBackBuffers[m_frameIndex]) + { + return; + } + + m_d3d11On12Device->ReleaseWrappedResources(&m_wrappedBackBuffers[m_frameIndex], 1); + m_d3d11DeviceContext->Flush(); +} + +ID3D12Resource* D3D12RenderContext::GetDepthStencilResource() +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[0]; + return pRenderTarget->GetDepthStencilResource(); +} + +D3D12_CPU_DESCRIPTOR_HANDLE D3D12RenderContext::GetRenderTargetViewHandle() +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[0]; + return pRenderTarget->GetRenderTargetViewHandle(); +} + +D3D12_CPU_DESCRIPTOR_HANDLE D3D12RenderContext::GetDepthStencilViewHandle() +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[0]; + return pRenderTarget->GetDepthStencilViewHandle(); +} + +void D3D12RenderContext::AcquireRenderTarget(bool doClear, int renderTargetIndex) +{ + m_pCurrentRenderTarget = m_RenderTargetMap[renderTargetIndex]; + m_pCurrentRenderTarget->PreRender(doClear); +} + +void D3D12RenderContext::ReleaseRenderTarget(int renderTargetIndex) +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[renderTargetIndex]; + pRenderTarget->PostRender(); +} + +void D3D12RenderContext::SetClearColor(int renderTargetIndex, float r, float g, float b, float a, float depth, float stencil) +{ + D3D12RenderTarget* pRenderTarget = m_RenderTargetMap[renderTargetIndex]; + pRenderTarget->SetClearColor(r, g, b, a, depth, stencil); +} + +void D3D12RenderContext::WaitForGpu() +{ + const UINT64 fence = m_fenceValue; + ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), fence)); + m_fenceValue++; + + // Wait until the previous frame is finished. + if (m_fence->GetCompletedValue() < fence) + { + ThrowIfFailed(m_fence->SetEventOnCompletion(fence, m_fenceEvent)); + WaitForSingleObject(m_fenceEvent, INFINITE); + } +} + +void D3D12RenderContext::InitBuffer(NVHairReadOnlyBuffer& buffer) +{ + buffer.Init(&m_srvUavHeap); +} + +void D3D12RenderContext::DestroyBuffer(NVHairReadOnlyBuffer& buffer) +{ + buffer.Release(); +} + +CD3DX12_CPU_DESCRIPTOR_HANDLE D3D12RenderContext::NVHairINT_CreateD3D12ReadOnlyBuffer( + UINT stride, + UINT numElements, + NVHairReadOnlyBuffer* pReadOnlyBuffer, + void* pSysMem) +{ + ID3D12Device* pd3dDevice = m_device.Get(); + ID3D12GraphicsCommandList* pCommandList = m_commandList.Get(); + + UINT bufferSize = numElements * stride; + + HRESULT hr; + hr = pd3dDevice->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + D3D12_HEAP_FLAG_NONE, + &CD3DX12_RESOURCE_DESC::Buffer(bufferSize), + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(pReadOnlyBuffer->m_pBuffer.ReleaseAndGetAddressOf())); + + hr = pd3dDevice->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + D3D12_HEAP_FLAG_NONE, + &CD3DX12_RESOURCE_DESC::Buffer(bufferSize), + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(pReadOnlyBuffer->m_pBufferUpload.ReleaseAndGetAddressOf())); + + D3D12_SUBRESOURCE_DATA data = {}; + data.pData = reinterpret_cast<UINT8*>(pSysMem); + data.RowPitch = bufferSize; + data.SlicePitch = data.RowPitch; + + PreRender(); + UpdateSubresources<1>(pCommandList, pReadOnlyBuffer->m_pBuffer.Get(), pReadOnlyBuffer->m_pBufferUpload.Get(), 0, 0, 1, &data); + pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(pReadOnlyBuffer->m_pBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)); + PostRender(); + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle(pReadOnlyBuffer->m_pSrvUavHeap->m_pHeap.Get()->GetCPUDescriptorHandleForHeapStart(), pReadOnlyBuffer->m_srvIndex, pReadOnlyBuffer->m_pSrvUavHeap->m_sizeDescriptor); + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_UNKNOWN; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; + srvDesc.Buffer.FirstElement = 0; + srvDesc.Buffer.NumElements = numElements; + srvDesc.Buffer.StructureByteStride = stride; + srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE; + pd3dDevice->CreateShaderResourceView(pReadOnlyBuffer->m_pBuffer.Get(), &srvDesc, srvHandle); + + return srvHandle; +} + +CD3DX12_CPU_DESCRIPTOR_HANDLE D3D12RenderContext::NVHairINT_CreateD3D12Texture(ID3D12Resource* pTexture, int& nIndexInHeap) +{ + CD3DX12_CPU_DESCRIPTOR_HANDLE handle = {}; + + if (!pTexture) + return handle; + + ID3D12Device* pDevice = m_device.Get(); + if (!pDevice) + return handle; + + nIndexInHeap = m_srvUavHeap.allocate(); + if(nIndexInHeap == -1) + return handle; + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle(m_srvUavHeap.m_pHeap.Get()->GetCPUDescriptorHandleForHeapStart(), + nIndexInHeap, m_srvUavHeap.m_sizeDescriptor); + + D3D12_RESOURCE_DESC desc = pTexture->GetDesc(); + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = desc.Format; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + + pDevice->CreateShaderResourceView(pTexture, &srvDesc, srvHandle); + + return srvHandle; +} + +void D3D12RenderContext::NVHairINT_DestroyD3D12Texture(int& nIndexInHeap) +{ + if (nIndexInHeap != -1) + { + m_srvUavHeap.deallocate(nIndexInHeap); + } +} + +void D3D12RenderContext::SetSampleCount(int nSampleCount) +{ + m_sampleCount = 1; + + if (nSampleCount > D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT) + nSampleCount = D3D12_MAX_MULTISAMPLE_SAMPLE_COUNT; + + if (nSampleCount > 1) + { + D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS qualityLevels; + qualityLevels.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + qualityLevels.Flags = D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE; + qualityLevels.NumQualityLevels = 0; + qualityLevels.SampleCount = nSampleCount; + + ID3D12Device *pDevice = GetDevice(); + pDevice->CheckFeatureSupport(D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS, &qualityLevels, sizeof(qualityLevels)); + + if (qualityLevels.NumQualityLevels > 0) + { + m_sampleCount = qualityLevels.SampleCount; + } + } +} + +int D3D12RenderContext::GetSampleCount() +{ + return m_sampleCount; +}
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.h new file mode 100644 index 0000000..2e0b393 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.h @@ -0,0 +1,254 @@ +#pragma once + +#include "D3D12RenderTarget.h" +#include "RenderPlugin.h" + +#include "d3dx12.h" +#include <wrl.h> +using namespace Microsoft::WRL; + +struct NVHairHeap +{ + ComPtr<ID3D12DescriptorHeap> m_pHeap; + UINT m_sizeHeap; + UINT m_currentIndex; + UINT m_sizeDescriptor; + std::vector<UINT> m_availableIndexes; + + void Init(ID3D12Device* pd3dDevice, UINT size, D3D12_DESCRIPTOR_HEAP_TYPE type, D3D12_DESCRIPTOR_HEAP_FLAGS flags) + { + HRESULT hr; + + D3D12_DESCRIPTOR_HEAP_DESC srvHeapDesc = {}; + srvHeapDesc.NumDescriptors = size; + srvHeapDesc.Flags = flags; + srvHeapDesc.Type = type; + hr = pd3dDevice->CreateDescriptorHeap(&srvHeapDesc, IID_PPV_ARGS(m_pHeap.ReleaseAndGetAddressOf())); + + if (SUCCEEDED(hr)) + { + m_sizeHeap = size; + m_sizeDescriptor = pd3dDevice->GetDescriptorHandleIncrementSize(type); + } + else + { + m_sizeHeap = 0; + m_sizeDescriptor = 0; + } + m_currentIndex = 0; + m_availableIndexes.clear(); + } + + UINT allocate() + { + int availables = m_availableIndexes.size(); + if (availables > 0) + { + UINT index = m_availableIndexes[availables - 1]; + m_availableIndexes.pop_back(); + return index; + } + UINT index = m_currentIndex++; + if (m_sizeHeap > m_currentIndex) + return index; + return (UINT)-1; + } + + void deallocate(UINT availableIndex) + { + m_availableIndexes.push_back(availableIndex); + } + + void Release() + { + if (m_pHeap) m_pHeap = nullptr; + m_sizeHeap = 0; + m_currentIndex = 0; + m_sizeDescriptor = 0; + m_availableIndexes.clear(); + } +}; + +struct NVHairVertexBuffer +{ + ComPtr<ID3D12Resource> m_pBuffer; + ComPtr<ID3D12Resource> m_pBufferUpload; + D3D12_VERTEX_BUFFER_VIEW m_vertexBufferView; + NVHairHeap* m_pSrvUavHeap; + UINT m_uavIndex; + + void Init(NVHairHeap* pHeap) + { + m_pBuffer = nullptr; + m_pBufferUpload = nullptr; + memset(&m_vertexBufferView, 0, sizeof(D3D12_VERTEX_BUFFER_VIEW)); + m_pSrvUavHeap = pHeap; + + m_uavIndex = m_pSrvUavHeap->allocate(); + } + + D3D12_CPU_DESCRIPTOR_HANDLE getUavCpuHandle() + { + CD3DX12_CPU_DESCRIPTOR_HANDLE uavHandle(m_pSrvUavHeap->m_pHeap.Get()->GetCPUDescriptorHandleForHeapStart(), m_uavIndex, m_pSrvUavHeap->m_sizeDescriptor); + return uavHandle; + } + + void Release() + { + if (m_pBuffer) m_pBuffer = nullptr; + if (m_pBufferUpload) m_pBufferUpload = nullptr; + memset(&m_vertexBufferView, 0, sizeof(D3D12_VERTEX_BUFFER_VIEW)); + if (m_pSrvUavHeap) m_pSrvUavHeap = nullptr; + m_uavIndex = (UINT)-1; + } +}; + +struct NVHairReadOnlyBuffer +{ + ComPtr<ID3D12Resource> m_pBuffer; + ComPtr<ID3D12Resource> m_pBufferUpload; + NVHairHeap* m_pSrvUavHeap; + UINT m_srvIndex; + + void Init(NVHairHeap* pHeap) + { + m_pBuffer = nullptr; + m_pBufferUpload = nullptr; + m_pSrvUavHeap = pHeap; + + m_srvIndex = m_pSrvUavHeap->allocate(); + } + + CD3DX12_CPU_DESCRIPTOR_HANDLE getSrvCpuHandle() + { + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle(m_pSrvUavHeap->m_pHeap.Get()->GetCPUDescriptorHandleForHeapStart(), m_srvIndex, m_pSrvUavHeap->m_sizeDescriptor); + return srvHandle; + } + + void Release() + { + m_pSrvUavHeap->deallocate(m_srvIndex); + + if (m_pBuffer) m_pBuffer = nullptr; + if (m_pBufferUpload) m_pBufferUpload = nullptr; + if (m_pSrvUavHeap) m_pSrvUavHeap = nullptr; + m_srvIndex = (UINT)-1; + } +}; + +class CORERENDER_EXPORT D3D12RenderContext +{ +public: + ~D3D12RenderContext(); + static D3D12RenderContext* Instance(); + + class GpuInterface + { + public: + virtual void onGpuWorkSubmitted(ID3D12CommandQueue* queue) = 0; + virtual void updateGpuWorkCompleted() = 0; + virtual ~GpuInterface() {} + }; + + typedef void (*GpuWorkSubmitFunc)(ID3D12CommandQueue* queue, void* data); + typedef void (*GpuUpdateCompletedFunc)(void* data); + + void InitDevice(); + void InitSwapchain(int width, int height, HWND hWnd); + void ResizeSwapchain(int width, int height); + void PostCreate(); + + void OnDestroy(); + + void PreRender(); + void PostRender(); + void Flush(); + + void SubmitGpuWork(); + void WaitForGpu(); + + void UpdateGpuWorkCompleted(); + + void Present(); + + int AllocRenderTargetIndex(); + D3D12RenderTarget* CreateRenderTarget(int renderTargetIndex, int nWidth, int nHeight); + void SetClearColor(int renderTargetIndex, float r, float g, float b, float a = 1.0, float depth = 1.0, float stencil = 0.0); + void AcquireRenderTarget(bool doClear = false, int renderTargetIndex = 0); + void ReleaseRenderTarget(int renderTargetIndex = 0); + ID3D12Resource* GetTexture(int renderTargetIndex, int index = 0); + void SetViewport(D3D12_VIEWPORT& vp); + void GetViewport(D3D12_VIEWPORT& vp); + + ID3D12Device* GetDevice() { return m_device.Get(); } + ID3D12GraphicsCommandList* GetGraphicsCommandList() { return m_commandList.Get(); } + ID3D12CommandQueue* GetCommandQueue() const { return m_commandQueue.Get(); } + + IDXGISwapChain3* GetSwapChain() { return m_swapChain.Get(); } + UINT GetFrameIndex() { return m_frameIndex; } + + ID3D11Device* GetDevice11() { return m_d3d11Device.Get(); } + ID3D11On12Device* GetDevice11On12() { return m_d3d11On12Device.Get(); } + ID3D11DeviceContext* GetDeviceContext() { return m_d3d11DeviceContext.Get(); } + + D3D12_RESOURCE_DESC GetBackBufferDesc(); + void SwitchToDX11(); + void FlushDX11(); + + ID3D12Resource* GetDepthStencilResource(); + D3D12_CPU_DESCRIPTOR_HANDLE GetRenderTargetViewHandle(); + D3D12_CPU_DESCRIPTOR_HANDLE GetDepthStencilViewHandle(); + + void InitBuffer(NVHairReadOnlyBuffer& buffer); + void DestroyBuffer(NVHairReadOnlyBuffer& buffer); + + CD3DX12_CPU_DESCRIPTOR_HANDLE NVHairINT_CreateD3D12ReadOnlyBuffer( + UINT stride, + UINT numElements, + NVHairReadOnlyBuffer* pReadOnlyBuffer, + void* pSysMem); + + CD3DX12_CPU_DESCRIPTOR_HANDLE NVHairINT_CreateD3D12Texture(ID3D12Resource* pTexture, int& nIndexInHeap); + void NVHairINT_DestroyD3D12Texture(int& nIndexInHeap); + + void SetSampleCount(int nSampleCount); + int GetSampleCount(); + + void AddGpuInterface(GpuInterface* intf); + +private: + void OnGpuWorkSubmitted(ID3D12CommandQueue* queue); + + D3D12RenderContext(); + + ComPtr<IDXGIFactory4> m_factory; + ComPtr<IDXGIAdapter1> m_adapter; + + ComPtr<ID3D12Device> m_device; + ComPtr<ID3D12CommandQueue> m_commandQueue; + ComPtr<ID3D12CommandAllocator> m_commandAllocator; + ComPtr<ID3D12GraphicsCommandList> m_commandList; + ComPtr<IDXGISwapChain3> m_swapChain; + + ComPtr<ID3D11Device> m_d3d11Device; + ComPtr<ID3D11On12Device> m_d3d11On12Device; + ComPtr<ID3D11DeviceContext> m_d3d11DeviceContext; + ID3D11Resource** m_wrappedBackBuffers; + ID3D11RenderTargetView** m_pD3D11RenderTargetView; + + UINT m_frameIndex; + HANDLE m_fenceEvent; + ComPtr<ID3D12Fence> m_fence; + UINT64 m_fenceValue; + + D3D12RenderTarget* m_pCurrentRenderTarget; + map<int, D3D12RenderTarget*> m_RenderTargetMap; + + std::vector<GpuInterface*> m_gpuInterfaces; + + NVHairHeap m_srvUavHeap; + + // sample desc + UINT m_sampleCount; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.cpp new file mode 100644 index 0000000..2346683 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.cpp @@ -0,0 +1,467 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12RenderInterface.h" + +#include "D3D12TextureResource.h" +#include "D3D12Shaders.h" +#include "D3D12Buffer.h" + +#include "D3D12RenderContext.h" + +namespace RenderInterfaceD3D12 +{ + using namespace RenderInterface; + + D3D12_BLEND_DESC m_BlendStates[BLEND_STATE_END]; + D3D12_DEPTH_STENCIL_DESC m_DepthStencilStates[DEPTH_STENCIL_STATE_END]; + D3D12_RASTERIZER_DESC m_RasterizerStates[RASTERIZER_STATE_END]; + + D3D12RenderContext *pRenderContext = D3D12RenderContext::Instance(); + + SHADER_TYPE m_ShaderType; + RenderShaderStateKey m_ShaderStateKey; + + map<RenderShaderStateKey, RenderShaderState*> m_RenderShaderStates; + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +bool InitDevice(int deviceID) +{ + pRenderContext->InitDevice(); + return true; +} + +////////////////////////////////////////////////////////////////////////// +bool Initialize() +{ + if (!pRenderContext) + return false; + + InitializeShadersD3D12(); + InitializeRenderStates(); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +void Shutdown() +{ + DestroyShadersD3D12(); +} + +RenderShaderState* GetShaderState() +{ + RenderShaderState* pShaderState = nullptr; + map<RenderShaderStateKey, RenderShaderState*>::iterator it = m_RenderShaderStates.find(m_ShaderStateKey); + if (it != m_RenderShaderStates.end()) + { + pShaderState = it->second; + } + else + { + pShaderState = new RenderShaderState; + pShaderState->BlendState = m_BlendStates[m_ShaderStateKey.BlendState]; + pShaderState->DepthStencilState = m_DepthStencilStates[m_ShaderStateKey.DepthStencilState]; + pShaderState->RasterizerState = m_RasterizerStates[m_ShaderStateKey.RasterizerState]; + pShaderState->PrimitiveTopologyType = m_ShaderStateKey.PrimitiveTopologyType; + if (m_ShaderStateKey.ForShadow) + { + pShaderState->RTVFormat = DXGI_FORMAT_R32_FLOAT; + pShaderState->DSVFormat = DXGI_FORMAT_D32_FLOAT; + } + else + { + pShaderState->RTVFormat = DXGI_FORMAT_R8G8B8A8_UNORM; + pShaderState->DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; + pShaderState->SampleCount = D3D12RenderContext::Instance()->GetSampleCount(); + } + + m_RenderShaderStates[m_ShaderStateKey] = pShaderState; + } + return pShaderState; +} +////////////////////////////////////////////////////////////////////////////////////// +void InitializeRenderStates() +{ + ///////////////////////////////////////////////////////////////////////////////////////// + // alpha blending state descriptors + ///////////////////////////////////////////////////////////////////////////////////////// + + // alpha blending enabled + { + D3D12_BLEND_DESC desc = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + desc.AlphaToCoverageEnable = false; + desc.IndependentBlendEnable = false; + + D3D12_RENDER_TARGET_BLEND_DESC &rtDesc = desc.RenderTarget[0]; + { + rtDesc.BlendEnable = true; + rtDesc.SrcBlend = D3D12_BLEND_SRC_ALPHA; + rtDesc.DestBlend = D3D12_BLEND_INV_SRC_ALPHA; + rtDesc.BlendOp = D3D12_BLEND_OP_ADD; + rtDesc.SrcBlendAlpha = D3D12_BLEND_ZERO; + rtDesc.DestBlendAlpha = D3D12_BLEND_ONE; + rtDesc.BlendOpAlpha = D3D12_BLEND_OP_ADD; + rtDesc.RenderTargetWriteMask = 0x0f; + } + m_BlendStates[BLEND_STATE_ALPHA] = desc; + } + + // no alpha blending + { + D3D12_BLEND_DESC desc = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + desc.AlphaToCoverageEnable = false; + desc.IndependentBlendEnable = false; + + D3D12_RENDER_TARGET_BLEND_DESC &rtDesc = desc.RenderTarget[0]; + { + rtDesc.BlendEnable = false; + rtDesc.SrcBlend = D3D12_BLEND_SRC_ALPHA; + rtDesc.DestBlend = D3D12_BLEND_INV_SRC_ALPHA; + rtDesc.BlendOp = D3D12_BLEND_OP_ADD; + rtDesc.SrcBlendAlpha = D3D12_BLEND_ZERO; + rtDesc.DestBlendAlpha = D3D12_BLEND_ONE; + rtDesc.BlendOpAlpha = D3D12_BLEND_OP_ADD; + rtDesc.RenderTargetWriteMask = 0x0f; + } + m_BlendStates[BLEND_STATE_NONE] = desc; + } + + ////////////////////////////////////////////////////////////////////////////////////////////// + // depth and stencil + /////////////////////////////////////////////////////////////////////////////////////////////// + D3D12_DEPTH_STENCIL_DESC depthTestDesc = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT); + { + depthTestDesc.DepthEnable = true; + depthTestDesc.DepthFunc = D3D12_COMPARISON_FUNC_LESS; + depthTestDesc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; + depthTestDesc.StencilEnable = false; + depthTestDesc.StencilReadMask = 0xff; + depthTestDesc.StencilWriteMask = 0xff; + } + + m_DepthStencilStates[DEPTH_STENCIL_DEPTH_TEST] = depthTestDesc; + + D3D12_DEPTH_STENCIL_DESC depthNone = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT); + { + depthNone.DepthEnable = false; + depthNone.DepthFunc = D3D12_COMPARISON_FUNC_LESS; + depthNone.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO; + depthNone.StencilEnable = false; + depthNone.StencilReadMask = 0xff; + depthNone.StencilWriteMask = 0xff; + } + + m_DepthStencilStates[DEPTH_STENCIL_DEPTH_NONE] = depthNone; + + ////////////////////////////////////////////////////////////////////////////////////////////// + // rasterizer + /////////////////////////////////////////////////////////////////////////////////////////////// + D3D12_RASTERIZER_DESC rsDesc = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + + // solid cull front + { + rsDesc.FillMode = D3D12_FILL_MODE_SOLID; + rsDesc.CullMode = D3D12_CULL_MODE_FRONT; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = true; + rsDesc.DepthBias = 10; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ForcedSampleCount = 0; + + m_RasterizerStates[RASTERIZER_STATE_FILL_CULL_FRONT] = rsDesc; + }; + + // solid cull back + { + rsDesc.FillMode = D3D12_FILL_MODE_SOLID; + rsDesc.CullMode = D3D12_CULL_MODE_BACK; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = true; + rsDesc.DepthBias = 10; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ForcedSampleCount = 0; + + m_RasterizerStates[RASTERIZER_STATE_FILL_CULL_BACK] = rsDesc; + } + + // solid cull none + { + rsDesc.FillMode = D3D12_FILL_MODE_SOLID; + rsDesc.CullMode = D3D12_CULL_MODE_NONE; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = true; + rsDesc.DepthBias = 10; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ForcedSampleCount = 0; + + m_RasterizerStates[RASTERIZER_STATE_FILL_CULL_NONE] = rsDesc; + } + + // wireframe cull none + { + rsDesc.FillMode = D3D12_FILL_MODE_WIREFRAME; + rsDesc.CullMode = D3D12_CULL_MODE_NONE; + rsDesc.AntialiasedLineEnable = false; + rsDesc.MultisampleEnable = true; + rsDesc.FrontCounterClockwise = 0; + rsDesc.DepthBias = 0; + rsDesc.DepthBiasClamp = 0; + rsDesc.SlopeScaledDepthBias = 0; + rsDesc.DepthClipEnable = true; + rsDesc.ForcedSampleCount = 0; + }; + + m_RasterizerStates[RASTERIZER_STATE_WIRE] = rsDesc; +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetPrimitiveTopologyTriangleStrip() +{ + ID3D12GraphicsCommandList* pCommandList = pRenderContext->GetGraphicsCommandList(); + pCommandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetPrimitiveTopologyTriangleList() +{ + ID3D12GraphicsCommandList* pCommandList = pRenderContext->GetGraphicsCommandList(); + pCommandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetPrimitiveTopologyLineList() +{ + ID3D12GraphicsCommandList* pCommandList = pRenderContext->GetGraphicsCommandList(); + pCommandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_LINELIST); +} + +////////////////////////////////////////////////////////////////////////////////////// +void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset) +{ + D3D12_VERTEX_BUFFER_VIEW* vertexView = GPUBufferD3D12::GetVertexView(pBuffer); + if (!vertexView) + return; + + vertexView->StrideInBytes = stride; + ID3D12GraphicsCommandList* m_commandList = pRenderContext->GetGraphicsCommandList(); + m_commandList->IASetVertexBuffers(0, 1, vertexView); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyDepthStencilState(DEPTH_STENCIL_STATE state) +{ + m_ShaderStateKey.DepthStencilState = state; +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyRasterizerState(RASTERIZER_STATE state) +{ + m_ShaderStateKey.RasterizerState = state; +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyBlendState(BLEND_STATE state) +{ + m_ShaderStateKey.BlendState = state; +} + +void ApplyPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType) +{ + m_ShaderStateKey.PrimitiveTopologyType = PrimitiveTopologyType; +} + +void ApplyForShadow(int ForShadow) +{ + m_ShaderStateKey.ForShadow = ForShadow; +} + +void SwitchToDX11() +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->SwitchToDX11(); +} + +void FlushDX11() +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->FlushDX11(); +} + +void FlushDX12() +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->Flush(); +} + +void SubmitGpuWork() +{ + D3D12RenderContext::Instance()->SubmitGpuWork(); +} + +void WaitForGpu() +{ + D3D12RenderContext* context = D3D12RenderContext::Instance(); + context->WaitForGpu(); + context->UpdateGpuWorkCompleted(); +} + +///////////////////////////////////////////////////////////////////////////////////////// +void SetViewport(const RenderInterface::Viewport& vp) +{ + ID3D12GraphicsCommandList* pCommandList = pRenderContext->GetGraphicsCommandList(); + + D3D12_VIEWPORT d3dViewport; + + d3dViewport.TopLeftX = vp.TopLeftX; + d3dViewport.TopLeftY = vp.TopLeftY; + + d3dViewport.Width = vp.Width; + d3dViewport.Height = vp.Height; + + d3dViewport.MinDepth = vp.MinDepth; + d3dViewport.MaxDepth = vp.MaxDepth; + + pRenderContext->SetViewport(d3dViewport); +} + +///////////////////////////////////////////////////////////////////////////////////////// +void GetViewport(RenderInterface::Viewport& vp) +{ + D3D12_VIEWPORT d3dViewport; + pRenderContext->GetViewport(d3dViewport); + + vp.TopLeftX = d3dViewport.TopLeftX; + vp.TopLeftY = d3dViewport.TopLeftY; + + vp.Width = d3dViewport.Width; + vp.Height = d3dViewport.Height; + + vp.MinDepth = d3dViewport.MinDepth; + vp.MaxDepth = d3dViewport.MaxDepth; +} + +/////////////////////////////////////////////////////////////////////////////// +void Draw(unsigned int vertexCount, unsigned int startCount) +{ + ID3D12GraphicsCommandList* pCommandList = pRenderContext->GetGraphicsCommandList(); + pCommandList->DrawInstanced(vertexCount, 1, startCount, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +GPUBufferResource* CreateVertexBuffer( + unsigned int ByteWidth, void* pSysMem) +{ + ID3D12Device* pDevice = D3D12RenderContext::Instance()->GetDevice(); + if (!pDevice) + return false; + + ID3D12Resource* pBuffer = nullptr; + ThrowIfFailed(pDevice->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + D3D12_HEAP_FLAG_NONE, + &CD3DX12_RESOURCE_DESC::Buffer(ByteWidth), + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&pBuffer))); + if (nullptr == pBuffer) + { + return false; + } + + void* pData; + ThrowIfFailed(pBuffer->Map(0, nullptr, &pData)); + memcpy(pData, pSysMem, ByteWidth); + pBuffer->Unmap(0, nullptr); + + return GPUBufferD3D12::Create(pBuffer, ByteWidth); +} + +/////////////////////////////////////////////////////////////////////////////// +GPUShaderResource* CreateShaderResource(unsigned int stride, + unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer) +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + if (!pContext) + return false; + + ID3D12Device* pDevice = pContext->GetDevice(); + ID3D12GraphicsCommandList* pCommandList = pContext->GetGraphicsCommandList(); + + pContext->NVHairINT_CreateD3D12ReadOnlyBuffer(stride, numElements, pReadOnlyBuffer, pSysMem); + + int nIndexInHeap = -1; + return D3D12TextureResource::Create(pReadOnlyBuffer->m_pBuffer.Get(), pReadOnlyBuffer->getSrvCpuHandle(), nIndexInHeap); +} + +/////////////////////////////////////////////////////////////////////////////// +// create read only shader resource buffer +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +void CopyToDevice( + GPUBufferResource *pGPUBuffer, void* pSysMem, unsigned int ByteWidth) +{ + ID3D12Resource* pBuffer = GPUBufferD3D12::GetResource(pGPUBuffer); + if (!pBuffer) + return; + + void* pData; + ThrowIfFailed(pBuffer->Map(0, nullptr, &pData)); + memcpy(pData, pSysMem, ByteWidth); + pBuffer->Unmap(0, nullptr); + + /* + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + if (!pContext) + return; + + ID3D12Device* pDevice = pContext->GetDevice(); + ID3D12GraphicsCommandList* pCommandList = pContext->GetGraphicsCommandList(); + + D3D12_SUBRESOURCE_DATA data = {}; + data.pData = reinterpret_cast<UINT8*>(pSysMem); + data.RowPitch = ByteWidth; + data.SlicePitch = data.RowPitch; + + ID3D12Resource* m_pBufferUpload = GPUBufferD3D12::GetResourceUpload(pGPUBuffer, pDevice, ByteWidth); + + UpdateSubresources<1>(pCommandList, pBuffer, m_pBufferUpload, 0, 0, 1, &data); + pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(pBuffer, + D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)); + */ +} +} // end namespace diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.h new file mode 100644 index 0000000..8168936 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.h @@ -0,0 +1,74 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once +#include <d3d11.h> +#include <d3d12.h> +#include <dxgi1_4.h> +#include "RenderInterface.h" +#include "RenderPlugin.h" +class RenderShaderState; +// abstract interface to D3D calls +namespace RenderInterfaceD3D12 +{ + CORERENDER_EXPORT bool InitDevice(int deviceID); + CORERENDER_EXPORT bool Initialize(); + CORERENDER_EXPORT void Shutdown(); + + RenderShaderState* GetShaderState(); + void InitializeRenderStates(); + + CORERENDER_EXPORT void ApplyDepthStencilState(RenderInterface::DEPTH_STENCIL_STATE st); + CORERENDER_EXPORT void ApplyRasterizerState(RenderInterface::RASTERIZER_STATE st); + CORERENDER_EXPORT void ApplyBlendState(RenderInterface::BLEND_STATE st); + CORERENDER_EXPORT void ApplyPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType); + CORERENDER_EXPORT void ApplyForShadow(int ForShadow); + CORERENDER_EXPORT void SwitchToDX11(); + CORERENDER_EXPORT void FlushDX11(); + CORERENDER_EXPORT void FlushDX12(); + CORERENDER_EXPORT void SubmitGpuWork(); + CORERENDER_EXPORT void WaitForGpu(); + + CORERENDER_EXPORT void GetViewport(RenderInterface::Viewport& vp); + CORERENDER_EXPORT void SetViewport(const RenderInterface::Viewport& vp); + + CORERENDER_EXPORT GPUBufferResource* CreateVertexBuffer( unsigned int ByteWidth, void* pSysMem); + CORERENDER_EXPORT GPUShaderResource* CreateShaderResource( unsigned int stride, unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer); + + CORERENDER_EXPORT void CopyToDevice(GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth); + + CORERENDER_EXPORT void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset = 0); + + CORERENDER_EXPORT void SetPrimitiveTopologyTriangleStrip(); + CORERENDER_EXPORT void SetPrimitiveTopologyTriangleList(); + CORERENDER_EXPORT void SetPrimitiveTopologyLineList(); + + + CORERENDER_EXPORT void Draw(unsigned int vertexCount, unsigned int startCount = 0); +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.cpp new file mode 100644 index 0000000..f115349 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.cpp @@ -0,0 +1,384 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#include "D3D12RenderShader.h" + +#include "D3D12RenderInterface.h" +#include "D3D12Wrapper.h" +#include "D3D12RenderContext.h" +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); } +#endif + +/////////////////////////////////////////////////////////////////////////////// +D3D12RenderShader::D3D12RenderShader() +{ + m_vertexShader = 0; + m_vertexShaderSize = 0; + m_pixelShader = 0; + m_pixelShaderSize = 0; + + m_inputElementDescs = 0; + m_inputElementDescsNum = 0; + + m_pRootSignature = 0; + + m_scuHeap = 0; + m_scuDescriptorSize = 0; + + m_samplerHeap = 0; + m_samplerDescriptorSize = 0; + + m_PipelineStates.clear(); + + for (int i = 0; i < 2; i++) + { + m_ConstantBuffer[i] = nullptr; + } +} + +/////////////////////////////////////////////////////////////////////////////// +D3D12RenderShader::~D3D12RenderShader() +{ + for (int i = 0; i < 1; i++) + { + SAFE_RELEASE(m_ConstantBuffer[i]); + } +} + +/////////////////////////////////////////////////////////////////////////////// +D3D12RenderShader* D3D12RenderShader::Create( + const char *name, + void* vertexShader, size_t vertexShaderSize, void* pixelShader, size_t pixelShaderSize, + UINT cbufferSize0, UINT cbufferSize1, + D3D12_INPUT_ELEMENT_DESC* pElemDesc, UINT numElements, + int ShaderResourceNum, int UnorderedAccessNum, int SamplerNum) +{ + D3D12RenderContext* pAdapter = D3D12RenderContext::Instance(); + ID3D12Device* m_device = pAdapter->GetDevice(); + + D3D12RenderShader* pShader = new D3D12RenderShader; + + int sizeofuint = sizeof(UINT8); + pShader->m_vertexShaderSize = vertexShaderSize; + if (vertexShaderSize > 0) + { + pShader->m_vertexShader = new UINT8[vertexShaderSize / sizeofuint]; + memcpy(pShader->m_vertexShader, vertexShader, vertexShaderSize); + } + pShader->m_pixelShaderSize = pixelShaderSize; + if (pixelShaderSize > 0) + { + pShader->m_pixelShader = new UINT8[pixelShaderSize / sizeofuint]; + memcpy(pShader->m_pixelShader, pixelShader, pixelShaderSize); + } + + pShader->m_inputElementDescsNum = numElements; + pShader->m_inputElementDescs = pElemDesc; + + CD3DX12_DESCRIPTOR_RANGE ranges[3]; + CD3DX12_ROOT_PARAMETER rootParameters[2]; + + int rangesindex = 0; + int rootParametersindex = 0; + + if (ShaderResourceNum > 0) + { + ranges[rangesindex++].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, ShaderResourceNum, 0); + } + int ConstantBufferNum = 0; + if (cbufferSize0 > 0) + { + ConstantBufferNum++; + } + if (cbufferSize1 > 0) + { + ConstantBufferNum++; + } + if (ConstantBufferNum > 0) + { + ranges[rangesindex++].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, ConstantBufferNum, 0); + } + if (UnorderedAccessNum > 0) + { + ranges[rangesindex++].Init(D3D12_DESCRIPTOR_RANGE_TYPE_UAV, UnorderedAccessNum, 0); + } + if (rangesindex > 0) + { + rootParameters[rootParametersindex++].InitAsDescriptorTable(rangesindex, &ranges[0], D3D12_SHADER_VISIBILITY_ALL); + } + + if (SamplerNum > 0) + { + ranges[rangesindex].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, SamplerNum, 0); + rootParameters[rootParametersindex++].InitAsDescriptorTable(1, &ranges[rangesindex], D3D12_SHADER_VISIBILITY_ALL); + } + + D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags = + D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | + D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS | + D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS | + D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS; + CD3DX12_ROOT_SIGNATURE_DESC rootSignatureDesc; + rootSignatureDesc.Init(rootParametersindex, rootParameters, 0, nullptr, rootSignatureFlags); + + ComPtr<ID3DBlob> signature; + ComPtr<ID3DBlob> error; + ThrowIfFailed(D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error)); + ThrowIfFailed(m_device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&pShader->m_pRootSignature))); + + int numSCU = ShaderResourceNum + ConstantBufferNum + UnorderedAccessNum; + if (numSCU > 0) + { + D3D12_DESCRIPTOR_HEAP_DESC scuHeapDesc = {}; + scuHeapDesc.NumDescriptors = numSCU; + scuHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + scuHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + ThrowIfFailed(m_device->CreateDescriptorHeap(&scuHeapDesc, IID_PPV_ARGS(&pShader->m_scuHeap))); + pShader->m_scuDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + + if (ConstantBufferNum > 0) + { + CD3DX12_CPU_DESCRIPTOR_HANDLE scuHandle(pShader->m_scuHeap->GetCPUDescriptorHandleForHeapStart(), + ShaderResourceNum, pShader->m_scuDescriptorSize); + + if (cbufferSize0 > 0) + { + pShader->CreateParamBuffer(cbufferSize0, 0); + + // Describe and create a constant buffer view. + D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; + // CB size is required to be 256-byte aligned. + cbvDesc.SizeInBytes = (cbufferSize0 + 255) & ~255; + cbvDesc.BufferLocation = pShader->m_ConstantBuffer[0]->GetGPUVirtualAddress(); + m_device->CreateConstantBufferView(&cbvDesc, scuHandle); + scuHandle.Offset(pShader->m_scuDescriptorSize); + } + if (cbufferSize1 > 0) + { + pShader->CreateParamBuffer(cbufferSize1, 1); + + // Describe and create a constant buffer view. + D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {}; + // CB size is required to be 256-byte aligned. + cbvDesc.SizeInBytes = (cbufferSize1 + 255) & ~255; + cbvDesc.BufferLocation = pShader->m_ConstantBuffer[1]->GetGPUVirtualAddress(); + m_device->CreateConstantBufferView(&cbvDesc, scuHandle); + } + } + } + + if (SamplerNum > 0) + { + D3D12_DESCRIPTOR_HEAP_DESC samplerHeapDesc = {}; + samplerHeapDesc.NumDescriptors = SamplerNum; + samplerHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER; + samplerHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&samplerHeapDesc, IID_PPV_ARGS(&pShader->m_samplerHeap))); + pShader->m_samplerDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + + CD3DX12_CPU_DESCRIPTOR_HANDLE samplerHandle(pShader->m_samplerHeap->GetCPUDescriptorHandleForHeapStart()); + + if(SamplerNum == 1) + { + D3D12_SAMPLER_DESC pointClampSamplerDesc[1] = { + D3D12_FILTER_MIN_MAG_MIP_POINT, + D3D12_TEXTURE_ADDRESS_MODE_CLAMP, + D3D12_TEXTURE_ADDRESS_MODE_CLAMP, + D3D12_TEXTURE_ADDRESS_MODE_CLAMP, + 0.0, 0, D3D12_COMPARISON_FUNC_NEVER, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, D3D12_FLOAT32_MAX, + }; + m_device->CreateSampler(pointClampSamplerDesc, samplerHandle); + } + else if(SamplerNum == 2) + { + D3D12_SAMPLER_DESC linearSamplerDesc[1] = { + D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT, + D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE_WRAP, + D3D12_TEXTURE_ADDRESS_MODE_WRAP, + 0.0, 0, D3D12_COMPARISON_FUNC_NEVER, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, D3D12_FLOAT32_MAX, + }; + m_device->CreateSampler(linearSamplerDesc, samplerHandle); + samplerHandle.Offset(pShader->m_samplerDescriptorSize); + + D3D12_SAMPLER_DESC pointClampSamplerDesc[1] = { + D3D12_FILTER_MIN_MAG_MIP_POINT, + D3D12_TEXTURE_ADDRESS_MODE_CLAMP, + D3D12_TEXTURE_ADDRESS_MODE_CLAMP, + D3D12_TEXTURE_ADDRESS_MODE_CLAMP, + 0.0, 0, D3D12_COMPARISON_FUNC_NEVER, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, D3D12_FLOAT32_MAX, + }; + m_device->CreateSampler(pointClampSamplerDesc, samplerHandle); + } + } + + return pShader; +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderShader::SetConstantBuffer() +{ + return; +} + +ID3D12PipelineState* D3D12RenderShader::GetPipelineState(RenderShaderState* pShaderState) +{ + ID3D12PipelineState* pPipelineState = nullptr; + map<RenderShaderState*, ID3D12PipelineState*>::iterator it = m_PipelineStates.find(pShaderState); + if (it == m_PipelineStates.end()) + { + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; + psoDesc.InputLayout = { m_inputElementDescs, m_inputElementDescsNum }; + psoDesc.pRootSignature = m_pRootSignature; + psoDesc.VS = { reinterpret_cast<UINT8*>(m_vertexShader), m_vertexShaderSize }; + psoDesc.PS = { reinterpret_cast<UINT8*>(m_pixelShader), m_pixelShaderSize }; + psoDesc.BlendState = pShaderState->BlendState; + psoDesc.RasterizerState = pShaderState->RasterizerState; + psoDesc.DepthStencilState = pShaderState->DepthStencilState; + psoDesc.SampleMask = UINT_MAX; + psoDesc.PrimitiveTopologyType = pShaderState->PrimitiveTopologyType; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = pShaderState->RTVFormat; + psoDesc.DSVFormat = pShaderState->DSVFormat; + psoDesc.SampleDesc.Count = pShaderState->SampleCount; + + ID3D12Device* pDevice = D3D12RenderContext::Instance()->GetDevice(); + ThrowIfFailed(pDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&pPipelineState))); + + m_PipelineStates[pShaderState] = pPipelineState; + } + else + { + pPipelineState = it->second; + } + return pPipelineState; +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderShader::MakeCurrent() +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + ID3D12GraphicsCommandList* m_commandList = pContext->GetGraphicsCommandList(); + + RenderShaderState* pShaderState = RenderInterfaceD3D12::GetShaderState(); + if (nullptr == pShaderState) + { + return; + } + + ID3D12PipelineState* pPipelineState = GetPipelineState(pShaderState); + + m_commandList->SetGraphicsRootSignature(m_pRootSignature); + m_commandList->SetPipelineState(pPipelineState); + + vector<ID3D12DescriptorHeap*> heaps; + if (nullptr != m_scuHeap) + { + heaps.push_back(m_scuHeap); + } + if (nullptr != m_samplerHeap) + { + heaps.push_back(m_samplerHeap); + } + if (heaps.size() > 0) + { + m_commandList->SetDescriptorHeaps(heaps.size(), heaps.data()); + } + int heapindex = 0; + if (nullptr != m_scuHeap) + { + m_commandList->SetGraphicsRootDescriptorTable(heapindex++, m_scuHeap->GetGPUDescriptorHandleForHeapStart()); + } + if (nullptr != m_samplerHeap) + { + m_commandList->SetGraphicsRootDescriptorTable(heapindex++, m_samplerHeap->GetGPUDescriptorHandleForHeapStart()); + } +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderShader::Disable() +{ +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D12RenderShader::CreateParamBuffer( UINT sizeBuffer, UINT slot ) +{ + ID3D12Device* pDevice = D3D12RenderContext::Instance()->GetDevice(); + if (!pDevice) + return false; + + SAFE_RELEASE(m_ConstantBuffer[slot]); + + ThrowIfFailed(pDevice->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + D3D12_HEAP_FLAG_NONE, + &CD3DX12_RESOURCE_DESC::Buffer(sizeBuffer), + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&m_ConstantBuffer[slot]))); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +void* D3D12RenderShader::MapParam(UINT slot) +{ + if (!m_ConstantBuffer[slot]) + return 0; + + void* pData; + ThrowIfFailed(m_ConstantBuffer[slot]->Map(0, nullptr, &pData)); + return pData; +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderShader::UnmapParam( UINT slot ) +{ + if (!m_ConstantBuffer[slot]) + return; + + m_ConstantBuffer[slot]->Unmap(0, nullptr); +} + +void D3D12RenderShader::BindShaderResource(UINT slot, CD3DX12_CPU_DESCRIPTOR_HANDLE& handle) +{ + ID3D12Device* pDevice = D3D12RenderContext::Instance()->GetDevice(); + if (!pDevice) + return; + + CD3DX12_CPU_DESCRIPTOR_HANDLE destHandle(m_scuHeap->GetCPUDescriptorHandleForHeapStart(), slot, m_scuDescriptorSize); + if (handle.ptr != 0) + { + pDevice->CopyDescriptorsSimple(1, destHandle, handle, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + } +}
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.h new file mode 100644 index 0000000..d43783c --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.h @@ -0,0 +1,85 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include <d3d11.h> +#include <d3d12.h> + +#include "D3D12RenderTarget.h" + +class D3D12RenderShader +{ +public: + D3D12RenderShader(); + ~D3D12RenderShader(); + + static D3D12RenderShader* Create( + const char *name, + void* pVSBlob, size_t vsBlobSize, + void* pPSBlob, size_t psBlobSize, + UINT cbufferSize0 = 0, UINT cbufferSize1 = 0, + D3D12_INPUT_ELEMENT_DESC* pElemDesc = 0, UINT numElements = 0, + int ShaderResourceNum = 0, int UnorderedAccessNum = 0, int SamplerNum = 0); + + void MakeCurrent(); + void Disable(); + void SetConstantBuffer(); + + void* MapParam(UINT slot = 0); + void UnmapParam(UINT slot = 0); + + void BindShaderResource(UINT slot, CD3DX12_CPU_DESCRIPTOR_HANDLE& handle); + +protected: + bool CreateParamBuffer(UINT sizeBuffer, UINT slot = 0); + +private: + ID3D12PipelineState* GetPipelineState(RenderShaderState* pShaderState); + + void* m_vertexShader; + SIZE_T m_vertexShaderSize; + void* m_pixelShader; + SIZE_T m_pixelShaderSize; + + D3D12_INPUT_ELEMENT_DESC* m_inputElementDescs; + UINT m_inputElementDescsNum; + + ID3D12RootSignature* m_pRootSignature; + + ID3D12DescriptorHeap* m_scuHeap; + int m_scuDescriptorSize; + + ID3D12Resource* m_ConstantBuffer[2]; + + ID3D12DescriptorHeap* m_samplerHeap; + int m_samplerDescriptorSize; + + map<RenderShaderState*, ID3D12PipelineState*> m_PipelineStates; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.cpp new file mode 100644 index 0000000..301cad6 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.cpp @@ -0,0 +1,371 @@ +#include "D3D12RenderTarget.h" +#include "D3D12RenderContext.h" + +D3D12RenderTarget::D3D12RenderTarget(int renderTargetIndex, int nRenderTargetCount) +{ + m_RenderTargetIndex = renderTargetIndex; + + m_RenderTargetCount = nRenderTargetCount; + + m_BackBuffers = nullptr; + m_RenderTargets = nullptr; + m_DepthStencil = nullptr; + + m_pRenderContext = D3D12RenderContext::Instance(); + + if (m_RenderTargetCount > 0) + { + m_BackBuffers = new ID3D12Resource*[m_RenderTargetCount]; + + for (int n = 0; n < m_RenderTargetCount; n++) + { + m_BackBuffers[n] = nullptr; + } + + m_RenderTargets = new ID3D12Resource*[m_RenderTargetCount]; + + for (int n = 0; n < m_RenderTargetCount; n++) + { + m_RenderTargets[n] = nullptr; + } + } + + if (renderTargetIndex == 0) + { + m_rtvClearValue.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + m_rtvClearValue.Color[0] = 0.0; + m_rtvClearValue.Color[1] = 0.0; + m_rtvClearValue.Color[2] = 0.0; + m_rtvClearValue.Color[3] = 1.0; + } + else + { + m_rtvClearValue.Format = DXGI_FORMAT_R32_FLOAT; + m_rtvClearValue.Color[0] = FLT_MAX; + m_rtvClearValue.Color[1] = FLT_MAX; + m_rtvClearValue.Color[2] = FLT_MAX; + m_rtvClearValue.Color[3] = FLT_MAX; + } + + if (renderTargetIndex == 0) + { + m_dsvClearValue.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + } + else + { + m_dsvClearValue.Format = DXGI_FORMAT_D32_FLOAT; + } + m_dsvClearValue.DepthStencil.Depth = 1.0f; + m_dsvClearValue.DepthStencil.Stencil = 0; +} + +D3D12RenderTarget::~D3D12RenderTarget() +{ + if (nullptr != m_BackBuffers) + { + delete[] m_BackBuffers; + m_BackBuffers = nullptr; + } + + if (nullptr != m_RenderTargets) + { + delete[] m_RenderTargets; + m_RenderTargets = nullptr; + } +} + +ID3D12Resource* D3D12RenderTarget::GetDepthStencilResource() +{ + return m_DepthStencil; +} + +D3D12_CPU_DESCRIPTOR_HANDLE D3D12RenderTarget::GetRenderTargetViewHandle() +{ + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); + return rtvHandle; +} + +D3D12_CPU_DESCRIPTOR_HANDLE D3D12RenderTarget::GetDepthStencilViewHandle() +{ + CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); + return dsvHandle; +} + +void D3D12RenderTarget::CreateResource(int nWidth, int nHeight) +{ + ID3D12Device* m_device = m_pRenderContext->GetDevice(); + int nSampleCount = m_pRenderContext->GetSampleCount(); + + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); + + if (m_RenderTargetIndex == 0) + { + IDXGISwapChain3* m_swapChain = m_pRenderContext->GetSwapChain(); + + // Create a RTV for each frame. + for (int n = 0; n < m_RenderTargetCount; n++) + { + ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_BackBuffers[n]))); + + if (nSampleCount > 1) + { + // If we are multi-sampling - create a render target separate from the back buffer + CD3DX12_HEAP_PROPERTIES heapProps(D3D12_HEAP_TYPE_DEFAULT); + D3D12_RESOURCE_DESC desc = m_BackBuffers[n]->GetDesc(); + + desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + desc.SampleDesc.Count = nSampleCount; + desc.SampleDesc.Quality = 0; + desc.Alignment = 0; + + ThrowIfFailed(m_device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_RENDER_TARGET, + &m_rtvClearValue, IID_PPV_ARGS(&m_RenderTargets[n]))); + } + else + { + // The render targets and back buffers are the same thing + m_RenderTargets[n] = m_BackBuffers[n]; + } + + m_device->CreateRenderTargetView(m_RenderTargets[n], nullptr, rtvHandle); + rtvHandle.Offset(1, m_rtvDescriptorSize); + } + + { + auto resourceDesc = CD3DX12_RESOURCE_DESC::Tex2D(m_dsvClearValue.Format, + nWidth, nHeight, 1, 1, nSampleCount, 0, + D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + + ThrowIfFailed(m_device->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), // No need to read/write by CPU + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_DEPTH_WRITE, + &m_dsvClearValue, + IID_PPV_ARGS(&m_DepthStencil))); + + D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc = {}; + dsvDesc.ViewDimension = nSampleCount <= 1 ? D3D12_DSV_DIMENSION_TEXTURE2D : D3D12_DSV_DIMENSION_TEXTURE2DMS; + dsvDesc.Format = m_dsvClearValue.Format; + dsvDesc.Texture2D.MipSlice = 0; + dsvDesc.Flags = D3D12_DSV_FLAG_NONE; + m_device->CreateDepthStencilView(m_DepthStencil, &dsvDesc, m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); + } + } + else + { + { + auto resourceDesc = CD3DX12_RESOURCE_DESC::Tex2D(m_rtvClearValue.Format, + nWidth, nHeight, 1, 1, 1, 0, + D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET); + + D3D12_RENDER_TARGET_VIEW_DESC rtvDesc = {}; + rtvDesc.Format = m_rtvClearValue.Format; + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + rtvDesc.Texture2D.MipSlice = 0; + rtvDesc.Texture2D.PlaneSlice = 0; + + for (int n = 0; n < m_RenderTargetCount; n++) + { + m_device->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_RENDER_TARGET, + &m_rtvClearValue, + IID_PPV_ARGS(&m_RenderTargets[n])); + m_device->CreateRenderTargetView(m_RenderTargets[n], &rtvDesc, rtvHandle); + rtvHandle.Offset(1, m_rtvDescriptorSize); + } + } + + { + auto resourceDesc = CD3DX12_RESOURCE_DESC::Tex2D(m_dsvClearValue.Format, + nWidth, nHeight, 1, 1, 1, 0, + D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + + m_device->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_DEPTH_WRITE, + &m_dsvClearValue, + IID_PPV_ARGS(&m_DepthStencil)); + + D3D12_DEPTH_STENCIL_VIEW_DESC dsvDesc = {}; + dsvDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D; + dsvDesc.Format = m_dsvClearValue.Format; + dsvDesc.Texture2D.MipSlice = 0; + dsvDesc.Flags = D3D12_DSV_FLAG_NONE; + m_device->CreateDepthStencilView(m_DepthStencil, &dsvDesc, m_dsvHeap.Get()->GetCPUDescriptorHandleForHeapStart()); + } + } +} + +void D3D12RenderTarget::OnCreate(int nWidth, int nHeight) +{ + ID3D12Device* m_device = m_pRenderContext->GetDevice(); + + // Create descriptor heaps. + { + // Describe and create a render target view (RTV) descriptor heap. + D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {}; + rtvHeapDesc.NumDescriptors = m_RenderTargetCount; + rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; + rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap))); + + m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + + // Describe and create a render target view (RTV) descriptor heap. + D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {}; + dsvHeapDesc.NumDescriptors = 1; + dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; + dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&dsvHeapDesc, IID_PPV_ARGS(&m_dsvHeap))); + + m_dsvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV); + } + + OnResize(nWidth, nHeight); +} + +void D3D12RenderTarget::OnResize(int nWidth, int nHeight) +{ + CreateResource(nWidth, nHeight); + + // viewport and scissor rect + { + memset(&m_viewport, 0, sizeof(m_viewport)); + m_viewport.Width = nWidth; + m_viewport.Height = nHeight; + m_viewport.MaxDepth = 1.0; + + memset(&m_scissorRect, 0, sizeof(m_scissorRect)); + m_scissorRect.right = nWidth; + m_scissorRect.bottom = nHeight; + } +} + +void D3D12RenderTarget::OnDestroy() +{ + for (int n = 0; n < m_RenderTargetCount; n++) + { + Safe_Release(m_RenderTargets[n]); + + if (m_pRenderContext->GetSampleCount() > 1) + { + Safe_Release(m_BackBuffers[n]); + } + } + Safe_Release(m_DepthStencil); +} + +void D3D12RenderTarget::PreRender(bool doClear) +{ + ID3D12GraphicsCommandList* m_commandList = m_pRenderContext->GetGraphicsCommandList(); + m_commandList->RSSetViewports(1, &m_viewport); + m_commandList->RSSetScissorRects(1, &m_scissorRect); + + int numSamples = 1; + UINT m_frameIndex = 0; + D3D12_RESOURCE_STATES state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; + if (m_RenderTargetIndex == 0) + { + numSamples = m_pRenderContext->GetSampleCount(); + m_frameIndex = m_pRenderContext->GetFrameIndex(); + if (numSamples <= 1) + { + state = D3D12_RESOURCE_STATE_PRESENT; + } + else + { + state = D3D12_RESOURCE_STATE_RESOLVE_SOURCE; + } + } + + ID3D12Resource* pRenderTarget = m_RenderTargets[m_frameIndex]; + + m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(pRenderTarget, state, D3D12_RESOURCE_STATE_RENDER_TARGET)); + + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize); + CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); + m_commandList->OMSetRenderTargets(1, &rtvHandle, FALSE, &dsvHandle); + + if (doClear) + { + m_commandList->ClearRenderTargetView(rtvHandle, m_rtvClearValue.Color, 0, nullptr); + m_commandList->ClearDepthStencilView(dsvHandle, D3D12_CLEAR_FLAG_DEPTH, + m_dsvClearValue.DepthStencil.Depth, m_dsvClearValue.DepthStencil.Stencil, 0, nullptr); + } +} + +void D3D12RenderTarget::PostRender() +{ + ID3D12GraphicsCommandList* m_commandList = m_pRenderContext->GetGraphicsCommandList(); + + int numSamples = 1; + UINT m_frameIndex = 0; + D3D12_RESOURCE_STATES state = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; + if (m_RenderTargetIndex == 0) + { + numSamples = m_pRenderContext->GetSampleCount(); + m_frameIndex = m_pRenderContext->GetFrameIndex(); + state = D3D12_RESOURCE_STATE_PRESENT; + } + + if (numSamples <= 1) + { + ID3D12Resource* renderTarget = m_RenderTargets[m_frameIndex]; + CD3DX12_RESOURCE_BARRIER barrier(CD3DX12_RESOURCE_BARRIER::Transition(renderTarget, D3D12_RESOURCE_STATE_RENDER_TARGET, state)); + m_commandList->ResourceBarrier(1, &barrier); + } + else + { + ID3D12Resource* backBuffer = m_BackBuffers[m_frameIndex]; + ID3D12Resource* renderTarget = m_RenderTargets[m_frameIndex]; + + // Barriers to wait for the render target, and the backbuffer to be in correct state + { + D3D12_RESOURCE_BARRIER barriers[] = + { + CD3DX12_RESOURCE_BARRIER::Transition(renderTarget, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_RESOLVE_SOURCE), + CD3DX12_RESOURCE_BARRIER::Transition(backBuffer, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RESOLVE_DEST), + }; + m_commandList->ResourceBarrier(2, barriers); + } + // Do the resolve... + m_commandList->ResolveSubresource(backBuffer, 0, renderTarget, 0, m_rtvClearValue.Format); + // Barrier until can present + { + CD3DX12_RESOURCE_BARRIER barrier(CD3DX12_RESOURCE_BARRIER::Transition(backBuffer, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_PRESENT)); + m_commandList->ResourceBarrier(1, &barrier); + } + } +} + +void D3D12RenderTarget::SetClearColor(float r, float g, float b, float a, float depth, float stencil) +{ + m_rtvClearValue.Color[0] = r; + m_rtvClearValue.Color[1] = g; + m_rtvClearValue.Color[2] = b; + m_rtvClearValue.Color[3] = a; + + m_dsvClearValue.DepthStencil.Depth = depth; + m_dsvClearValue.DepthStencil.Stencil = stencil; +} + +ID3D12Resource* D3D12RenderTarget::GetTexture(int nIndex, bool bRenderTarget) +{ + if (nIndex < 0 || nIndex > m_RenderTargetCount) + return nullptr; + + if (bRenderTarget) + { + return m_RenderTargets[nIndex]; + } + else + { + return m_BackBuffers[nIndex]; + } +} diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.h new file mode 100644 index 0000000..8ae0b7d --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.h @@ -0,0 +1,110 @@ +#pragma once + +class D3D12RenderContext; + +#include "RenderInterface.h" +using namespace RenderInterface; + +#include <d3d12.h> +#include <d3d11on12.h> +#include <dxgi1_4.h> +#include <D3Dcompiler.h> +#include <DirectXMath.h> +#include "d3dx12.h" +#include <string> +#include <vector> +#include <map> +#include <wrl.h> +#include <shellapi.h> +using namespace std; +using namespace DirectX; +using namespace Microsoft::WRL; + +#ifndef Safe_Delete +#define Safe_Delete(p) { if (p) { delete (p); (p) = nullptr; } } +#endif // !Safe_Delete +#ifndef Safe_Release +#define Safe_Release(p) { if (p) { p->Release(); (p) = nullptr; } } +#endif // !Safe_Delete + +inline void ThrowIfFailed(HRESULT hr) +{ + if (FAILED(hr)) + { + throw; + } +} + +typedef struct RenderShaderStateKey +{ + BLEND_STATE BlendState = BLEND_STATE_NONE; + RASTERIZER_STATE RasterizerState = RASTERIZER_STATE_FILL_CULL_NONE; + DEPTH_STENCIL_STATE DepthStencilState = DEPTH_STENCIL_DEPTH_TEST; + D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + int ForShadow = 0; + + bool operator <(const RenderShaderStateKey &other) const + { + int key = (((BlendState * 10 + RasterizerState) * 10 + DepthStencilState) * 10 + PrimitiveTopologyType) * 10 + ForShadow; + int otherkey = (((other.BlendState * 10 + other.RasterizerState) * 10 + other.DepthStencilState) * 10 + other.PrimitiveTopologyType) * 10 + other.ForShadow; + return key < otherkey; + } +} RenderShaderStateKey; + +typedef struct RenderShaderState +{ + D3D12_BLEND_DESC BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + D3D12_RASTERIZER_DESC RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + D3D12_DEPTH_STENCIL_DESC DepthStencilState = CD3DX12_DEPTH_STENCIL_DESC(D3D12_DEFAULT); + D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + DXGI_FORMAT RTVFormat = DXGI_FORMAT_R8G8B8A8_UNORM; + DXGI_FORMAT DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT; + int SampleCount = 1; +} RenderShaderState; + +class D3D12RenderTarget +{ +public: + D3D12RenderTarget(int renderTargetIndex, int nRenderTargetCount = 1); + ~D3D12RenderTarget(); + + void OnCreate(int nWidth, int nHeight); + void OnResize(int nWidth, int nHeight); + void OnDestroy(); + + void PreRender(bool doClear = false); + void PostRender(); + + void SetClearColor(float r, float g, float b, float a = 1.0, float depth = 1.0, float stencil = 0.0); + + ID3D12Resource* GetTexture(int nIndex = 0, bool bRenderTarget = true); + + D3D12_VIEWPORT m_viewport; + + ID3D12Resource* GetDepthStencilResource(); + D3D12_CPU_DESCRIPTOR_HANDLE GetRenderTargetViewHandle(); + D3D12_CPU_DESCRIPTOR_HANDLE GetDepthStencilViewHandle(); + +private: + void CreateResource(int nWidth, int nHeight); + + int m_RenderTargetIndex; + int m_RenderTargetCount; + + ID3D12Resource** m_BackBuffers; + ID3D12Resource** m_RenderTargets; + ID3D12Resource* m_DepthStencil; + + ComPtr<ID3D12DescriptorHeap> m_rtvHeap; + UINT m_rtvDescriptorSize; + ComPtr<ID3D12DescriptorHeap> m_dsvHeap; + UINT m_dsvDescriptorSize; + + D3D12_RECT m_scissorRect; + + D3D12RenderContext* m_pRenderContext; + + D3D12_CLEAR_VALUE m_rtvClearValue; + D3D12_CLEAR_VALUE m_dsvClearValue; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.cpp new file mode 100644 index 0000000..b640ebd --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.cpp @@ -0,0 +1,141 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12RendererWindow.h" + +#include "DXUT.h" +#include "DXUTgui.h" +#include "sdkmisc.h" + +#include "D3D12RenderInterface.h" +#include "D3D12RenderContext.h" +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +/////////////////////////////////////////////////////////////////////////////// +D3D12RenderWindow::D3D12RenderWindow() +{ + m_pRenderContext = D3D12RenderContext::Instance(); + + m_pDialogResourceManager = 0; + m_pTextHelper = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +D3D12RenderWindow::~D3D12RenderWindow() +{ + Free(); +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D12RenderWindow::Create( HWND hWnd, unsigned int nSamples ) +{ + m_pRenderContext->SetSampleCount(nSamples); + + RECT rc; + GetClientRect((HWND)hWnd, &rc); + int wBuf = rc.right - rc.left; + int hBuf = rc.bottom- rc.top; + + ID3D11Device *pDevice = m_pRenderContext->GetDevice11(); + ID3D11DeviceContext* pDeviceContext = m_pRenderContext->GetDeviceContext(); + if (nullptr != pDevice && nullptr != pDeviceContext) + { + m_pDialogResourceManager = new CDXUTDialogResourceManager; + m_pDialogResourceManager->OnD3D11CreateDevice(pDevice, pDeviceContext); + m_pTextHelper = new CDXUTTextHelper(pDevice, pDeviceContext, m_pDialogResourceManager, 15); + } + + m_pRenderContext->InitSwapchain(wBuf, hBuf, hWnd); + Resize(wBuf, hBuf); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderWindow::Free() +{ + FreeBuffer(); + + SAFE_DELETE(m_pTextHelper); + + if (m_pDialogResourceManager) + { + m_pDialogResourceManager->OnD3D11DestroyDevice(); + SAFE_DELETE(m_pDialogResourceManager); + } +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderWindow::FreeBuffer() +{ +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderWindow::Present() +{ +// m_pRenderContext->ReleaseRenderTarget(); + +// m_pRenderContext->PostRender(); + + m_pRenderContext->Present(); +} + +/////////////////////////////////////////////////////////////////////////////// +void D3D12RenderWindow::Clear(float r, float g, float b) +{ + m_pRenderContext->PreRender(); + + m_pRenderContext->SetClearColor(0, r, g, b); + m_pRenderContext->AcquireRenderTarget(true); +} + +/////////////////////////////////////////////////////////////////////////////// +bool D3D12RenderWindow::Resize( int w, int h ) +{ + assert(w > 0 && h > 0); + + m_pRenderContext->ResizeSwapchain(w, h); + + if (m_pDialogResourceManager) + { + ID3D11Device *pDevice = m_pRenderContext->GetDevice11(); + D3D12_RESOURCE_DESC descTex2D = m_pRenderContext->GetBackBufferDesc(); + + DXGI_SURFACE_DESC backbufferDesc; + backbufferDesc.Width = descTex2D.Width; + backbufferDesc.Height = descTex2D.Height; + backbufferDesc.Format = descTex2D.Format; + backbufferDesc.SampleDesc = descTex2D.SampleDesc; + + m_pDialogResourceManager->OnD3D11ResizedSwapChain(pDevice, &backbufferDesc); + } + + return true; +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.h new file mode 100644 index 0000000..abd5d9b --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.h @@ -0,0 +1,29 @@ +#pragma once + +#include <d3d12.h> +class D3D12RenderContext; +// DXUT stuffs for text rendering +class CDXUTDialogResourceManager; +class CDXUTTextHelper; + +struct D3D12RenderWindow +{ +public: + D3D12RenderWindow(); + ~D3D12RenderWindow(); + + bool Create(HWND hWnd, unsigned int nSamples = 1); + bool Resize(int w, int h); + void Present(); + void Clear(float r, float g, float b); + + CDXUTDialogResourceManager* m_pDialogResourceManager; + CDXUTTextHelper* m_pTextHelper; + +private: + void Free(); + void FreeBuffer(); + + D3D12RenderContext* m_pRenderContext; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.cpp new file mode 100644 index 0000000..0c07409 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.cpp @@ -0,0 +1,231 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12Shaders.h" + +#include "MeshShaderParam.h" +#include "LightShaderParam.h" + +//#include <Nv/Blast/NvHairSdk.h> +#include "D3D12RenderShader.h" +#include "D3D12RenderContext.h" +#include "D3D12TextureResource.h" +using namespace RenderInterface; + +D3D12_INPUT_ELEMENT_DESC layoutBodyRender[] = +{ + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "VERTEX_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "FACE_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 36, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 48, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "VERTEX_ID", 0, DXGI_FORMAT_R32_FLOAT, 0, 56, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, +}; + +D3D12_INPUT_ELEMENT_DESC layout_Position_And_Color[] = +{ + { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, +}; + +///////////////////////////////////////////////////////////////////////////////////// +// Common shader settings +//static D3D12RenderShader* g_pShaders[SHADER_TYPE_END]; +static std::map<int, D3D12RenderShader*> g_pShaders; +/* +namespace BodyShaderBlobs +{ + #include "Shaders/BodyShader_VS.h" + #include "Shaders/BodyShader_PS.h" +} + +namespace BodyShadowBlobs +{ + #include "Shaders/BodyShadow_VS.h" + #include "Shaders/BodyShadow_PS.h" +} + +namespace ScreenQuadBlobs +{ + #include "Shaders/ScreenQuad_VS.h" + #include "Shaders/ScreenQuad_PS.h" +} + +namespace ScreenQuadColorBlobs +{ + #include "Shaders/ScreenQuadColor_VS.h" + #include "Shaders/ScreenQuadColor_PS.h" +} + +namespace VisualizeShadowBlobs +{ + #include "Shaders/VisualizeShadow_VS.h" + #include "Shaders/VisualizeShadow_PS.h" +} + +namespace ColorBlobs +{ + #include "Shaders/Color_VS.h" + #include "Shaders/Color_PS.h" +} +*/ +////////////////////////////////////////////////////////////////////////// +bool InitializeShadersD3D12() +{ + /* + UINT numElements = sizeof(layoutBodyRender) / sizeof(D3D11_INPUT_ELEMENT_DESC); + + g_pShaders[SHADER_TYPE_MESH_RENDERING] = D3D12RenderShader::Create("MeshRenderShader", + (void*)BodyShaderBlobs::g_vs_main, sizeof(BodyShaderBlobs::g_vs_main), + (void*)BodyShaderBlobs::g_ps_main, sizeof(BodyShaderBlobs::g_ps_main), + sizeof(MeshShaderParam), 0, + &layoutBodyRender[0], numElements, + 10, 0, 2); + + g_pShaders[SHADER_TYPE_MESH_SHADOW] = D3D12RenderShader::Create("MeshShadowShader", + (void*)BodyShadowBlobs::g_vs_main, sizeof(BodyShadowBlobs::g_vs_main), + (void*)BodyShadowBlobs::g_ps_main, sizeof(BodyShadowBlobs::g_ps_main), + sizeof(MeshShadowShaderParam), 0, + &layoutBodyRender[0], numElements, + 2); + + g_pShaders[SHADER_TYPE_SCREEN_QUAD] = D3D12RenderShader::Create("ScreenQuadShader", + (void*)ScreenQuadBlobs::g_vs_main, sizeof(ScreenQuadBlobs::g_vs_main), + (void*)ScreenQuadBlobs::g_ps_main, sizeof(ScreenQuadBlobs::g_ps_main), + 0, 0, + 0, 0, + 1, 0, 1); + + g_pShaders[SHADER_TYPE_SCREEN_QUAD_COLOR] = D3D12RenderShader::Create("ScreenQuadColorShader", + (void*)ScreenQuadColorBlobs::g_vs_main, sizeof(ScreenQuadColorBlobs::g_vs_main), + (void*)ScreenQuadColorBlobs::g_ps_main, sizeof(ScreenQuadColorBlobs::g_ps_main)); + + g_pShaders[SHADER_TYPE_VISUALIZE_SHADOW] = D3D12RenderShader::Create("VisualizeShadowShader", + (void*)VisualizeShadowBlobs::g_vs_main, sizeof(VisualizeShadowBlobs::g_vs_main), + (void*)VisualizeShadowBlobs::g_ps_main, sizeof(VisualizeShadowBlobs::g_ps_main), + sizeof(ShadowVizParam), 0, + 0, 0, + 1, 0, 1); + + UINT numElements2 = sizeof(layout_Position_And_Color) / sizeof(D3D11_INPUT_ELEMENT_DESC); + + g_pShaders[SHADER_TYPE_SIMPLE_COLOR] = D3D12RenderShader::Create("Color", + (void*)ColorBlobs::g_vs_main, sizeof(ColorBlobs::g_vs_main), + (void*)ColorBlobs::g_ps_main, sizeof(ColorBlobs::g_ps_main), + sizeof(SimpleShaderParam), 0, + &layout_Position_And_Color[0], numElements2); + + g_pShaders[SHADER_TYPE_HAIR_SHADER_DEFAULT] = D3D12RenderShader::Create( + "hairShaderDefault", 0, 0, + (void*)BlastShaderBlobs::g_ps_main, sizeof(BlastShaderBlobs::g_ps_main), + sizeof(NvHair::ShaderConstantBuffer), + sizeof(LightShaderParam) + ); + + g_pShaders[SHADER_TYPE_HAIR_SHADER_SHADOW] = D3D12RenderShader::Create( + "hairShadow", 0, 0, + (void*)BlastShadowBlobs::g_ps_main, sizeof(BlastShadowBlobs::g_ps_main), + sizeof(NvHair::ShaderConstantBuffer), + 0); + */ + return true; +} + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +#ifndef SAFE_DELETE +#define SAFE_DELETE(x) { if (x) delete x; x = 0; } +#endif + +/////////////////////////////////////////////////////////////////////////////// +void DestroyShadersD3D12() +{ + for (int i = 0; i < g_pShaders.size(); i++) + { + D3D12RenderShader*& pShader = g_pShaders[i]; + if (pShader) + { + delete pShader; + pShader = 0; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +D3D12RenderShader* GetShaderD3D12(SHADER_TYPE st) +{ + return g_pShaders[st]; +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyShaderD3D12(SHADER_TYPE st) +{ + D3D12RenderShader* pD3D12Shader = GetShaderD3D12(st); + if (!pD3D12Shader) + return; + + pD3D12Shader->MakeCurrent(); +} + +void BindShaderResourcesD3D12(SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs) +{ + D3D12RenderShader* pD3D12Shader = GetShaderD3D12(st); + if (!pD3D12Shader) + return; + + for (int i = 0; i < numSRVs; i++) + { + CD3DX12_CPU_DESCRIPTOR_HANDLE handle = D3D12TextureResource::GetHandle(ppSRVs[i]); + pD3D12Shader->BindShaderResource(i, handle); + } +} + +/////////////////////////////////////////////////////////////////////////////// +void DisableShaderD3D12(RenderInterface::SHADER_TYPE st) +{ + D3D12RenderShader* pD3D12Shader = GetShaderD3D12(st); + if (!pD3D12Shader) + return; + + pD3D12Shader->Disable(); +} + +/////////////////////////////////////////////////////////////////////////////// +void CopyShaderParamD3D12(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot) +{ + D3D12RenderShader* pD3D12Shader = GetShaderD3D12(st); + if (!pD3D12Shader) + return; + + void* mappedParam = pD3D12Shader->MapParam(slot); + + memcpy(mappedParam, pSysMem, bytes); + + pD3D12Shader->UnmapParam(slot); +}
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.h new file mode 100644 index 0000000..29b0e1b --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.h @@ -0,0 +1,42 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "RenderInterface.h" +#include "RenderPlugin.h" +/////////////////////////////////////////////////////////////////// +// default shaders +/////////////////////////////////////////////////////////////////// +CORERENDER_EXPORT bool InitializeShadersD3D12(); +CORERENDER_EXPORT void DestroyShadersD3D12(); + +CORERENDER_EXPORT void ApplyShaderD3D12(RenderInterface::SHADER_TYPE st); +CORERENDER_EXPORT void DisableShaderD3D12(RenderInterface::SHADER_TYPE st); +CORERENDER_EXPORT void BindShaderResourcesD3D12(RenderInterface::SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs); +CORERENDER_EXPORT void CopyShaderParamD3D12(RenderInterface::SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot = 0); diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.cpp new file mode 100644 index 0000000..342c6f3 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.cpp @@ -0,0 +1,99 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12ShadowMap.h" + +#include "RenderResources.h" + +#include "D3D12RenderInterface.h" +#include "D3D12TextureResource.h" +#include "D3D12RenderContext.h" + +////////////////////////////////////////////////////////////////////////////// +D3D12ShadowMap::D3D12ShadowMap(int resolution) +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + m_nIndex = pContext->AllocRenderTargetIndex(); + m_pRenderTarget = pContext->CreateRenderTarget(m_nIndex, resolution, resolution); + ID3D12Resource* pTexture = pContext->GetTexture(m_nIndex); + int nIndexInHeap = -1; + CD3DX12_CPU_DESCRIPTOR_HANDLE handle = pContext->NVHairINT_CreateD3D12Texture(pTexture, nIndexInHeap); + m_ShadowResource.m_pResource = pTexture; + m_ShadowResource.m_Handle = handle; + m_ShadowResource.m_nIndexInHeap = nIndexInHeap; +} + +////////////////////////////////////////////////////////////////////////////// +D3D12ShadowMap::~D3D12ShadowMap() +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->NVHairINT_DestroyD3D12Texture(m_ShadowResource.m_nIndexInHeap); + + Release(); +} + +////////////////////////////////////////////////////////////////////////////// +void D3D12ShadowMap::Release() +{ +} + +////////////////////////////////////////////////////////////////////////////// +GPUShaderResource* D3D12ShadowMap::GetShadowSRV() +{ + return &m_ShadowResource; +} + +////////////////////////////////////////////////////////////////////////////// +bool D3D12ShadowMap::isValid() +{ + return m_pRenderTarget != nullptr; +} + +////////////////////////////////////////////////////////////////////////////// +void D3D12ShadowMap::BeginRendering(float clearDepth) +{ + if (!isValid()) + return; + + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->ReleaseRenderTarget(); + + pContext->AcquireRenderTarget(true, m_nIndex); +} + +////////////////////////////////////////////////////////////////////////////// +void D3D12ShadowMap::EndRendering() +{ + if (!isValid()) + return; + + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->ReleaseRenderTarget(m_nIndex); + + pContext->AcquireRenderTarget(); +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.h new file mode 100644 index 0000000..dabf9a1 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.h @@ -0,0 +1,68 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "ShadowMap.h" + +#include <d3d11.h> +#include <d3d12.h> +#include "D3D12TextureResource.h" + +#include "DXUT.h" // DXUT header +#include "d3dx12.h" + +#include "D3D12RenderTarget.h" + +using namespace Microsoft::WRL; + +class GPUShaderResource; +class D3D12TextureResource; + +struct D3D12ShadowMap : public ShadowMap +{ + D3D12TextureResource m_ShadowResource; + + D3D12RenderTarget* m_pRenderTarget; + +public: + D3D12ShadowMap(int resolution ); + ~D3D12ShadowMap(); + + void Release(); + void BeginRendering(float clearDepth); + void EndRendering(); + + GPUShaderResource* GetShadowSRV(); + +protected: + + bool isValid(); + int m_nIndex; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.cpp new file mode 100644 index 0000000..0247895 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.cpp @@ -0,0 +1,29 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12TextureResource.h" + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.h new file mode 100644 index 0000000..b6c7584 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.h @@ -0,0 +1,89 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "RenderResources.h" + +#include "d3d12.h" +#include "d3dx12.h" + +// GPU resources for texture +struct D3D12TextureResource : public GPUShaderResource +{ + ID3D12Resource* m_pResource; + CD3DX12_CPU_DESCRIPTOR_HANDLE m_Handle; + int m_nIndexInHeap; + +public: + static GPUShaderResource* Create( + ID3D12Resource* pResource, + CD3DX12_CPU_DESCRIPTOR_HANDLE handle, + int nIndexInHeap) { + D3D12TextureResource* pBuffer = new D3D12TextureResource; + pBuffer->m_pResource = pResource; + pBuffer->m_Handle = handle; + pBuffer->m_nIndexInHeap = nIndexInHeap; + return pBuffer; + } + + static ID3D12Resource* GetResource(GPUShaderResource* pBuffer) + { + D3D12TextureResource* pD3D12Buffer = dynamic_cast<D3D12TextureResource*>(pBuffer); + if (!pD3D12Buffer) + return 0; + return pD3D12Buffer->m_pResource; + } + + static CD3DX12_CPU_DESCRIPTOR_HANDLE GetHandle(GPUShaderResource* pBuffer) + { + CD3DX12_CPU_DESCRIPTOR_HANDLE handle = {}; + D3D12TextureResource* pD3D12Buffer = dynamic_cast<D3D12TextureResource*>(pBuffer); + if (pD3D12Buffer) + handle = pD3D12Buffer->m_Handle; + else + handle.ptr = 0; + return handle; + } + + D3D12TextureResource() + { + m_pResource = 0; + } + + void Release() + { + SAFE_RELEASE(m_pResource); + } + + ~D3D12TextureResource() + { + Release(); + } +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.cpp new file mode 100644 index 0000000..695bb41 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.cpp @@ -0,0 +1,386 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include <DirectXTex.h> +#include "D3D12Util.h" + +#include "D3D12Shaders.h" +#include "D3D12RenderShader.h" + +#include "D3DX10tex.h" +#include "D3DX11tex.h" + +#include "D3D12Wrapper.h" +#include "DXUT.h" +#include "DXUTgui.h" +#include "sdkmisc.h" +#include "D3D12RendererWindow.h" +#include "SimpleRenderable.h" +//#include "MeshShaderParam.h" +#include "D3D12RenderInterface.h" +#include "D3D12TextureResource.h" +#include "D3D12RenderContext.h" +namespace D3D12Util +{ + using namespace RenderInterface; + + // D3D hook to render window + D3D12RenderWindow* g_pRenderWindow = 0; + +/////////////////////////////////////////////////////////////////////////////// +GPUShaderResource* + CreateTextureSRV(const char* texturename) +{ + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + if (!pContext) + return 0; + ID3D12Device* pDevice = pContext->GetDevice(); + if (!pDevice) + return 0; + ID3D12GraphicsCommandList* pCommandList = pContext->GetGraphicsCommandList(); + if (!pCommandList) + return 0; + + unsigned char *pSTBIRes = 0; + int width = 0; + int height = 0; + + size_t nu = strlen(texturename); + size_t n = (size_t)MultiByteToWideChar(CP_ACP, 0, (const char *)texturename, (int)nu, NULL, 0); + wchar_t* pwstr = new wchar_t[n]; + MultiByteToWideChar(CP_ACP, 0, (const char *)texturename, (int)nu, pwstr, (int)n); + pwstr[n] = 0; + + TexMetadata texMetadata; + ScratchImage scratchImage; + HRESULT loaded = LoadFromTGAFile(pwstr, &texMetadata, scratchImage); + + if (loaded != S_OK) + { + loaded = LoadFromWICFile(pwstr, TEX_FILTER_DEFAULT | WIC_FLAGS_ALL_FRAMES, &texMetadata, scratchImage); + } + + if (loaded != S_OK) + { + loaded = LoadFromDDSFile(pwstr, DDS_FLAGS_NONE, &texMetadata, scratchImage); + } + + if (loaded == S_OK) + { + pSTBIRes = scratchImage.GetPixels(); + width = texMetadata.width; + height = texMetadata.height; + } + + if (!pSTBIRes) + return 0; + + int numMipMaps = 0; + { + int mipWidth = width; + int mipHeight = height; + while (mipWidth > 1 || mipHeight > 1) + { + numMipMaps++; + mipWidth >>= 1; + mipHeight >>= 1; + + if ((mipWidth * sizeof(uint32_t)) < D3D12_TEXTURE_DATA_PITCH_ALIGNMENT) + break; + } + } + + std::vector<D3D12_PLACED_SUBRESOURCE_FOOTPRINT> layouts(numMipMaps); + std::vector<uint64_t> row_sizes_in_bytes(numMipMaps); + std::vector<uint32_t> num_rows(numMipMaps); + + auto resourceDesc = CD3DX12_RESOURCE_DESC::Tex2D( + DXGI_FORMAT_R8G8B8A8_UNORM, width, height, 1, (UINT16)numMipMaps, 1, 0, D3D12_RESOURCE_FLAG_NONE, + D3D12_TEXTURE_LAYOUT_UNKNOWN, 0); + + uint64_t required_size = 0; + pDevice->GetCopyableFootprints(&resourceDesc, 0, numMipMaps, 0, &layouts[0], &num_rows[0], &row_sizes_in_bytes[0], &required_size); + + HRESULT hr; + ID3D12Resource* mTextureUpload; + ID3D12Resource* mTexture; + + hr = pDevice->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + D3D12_HEAP_FLAG_NONE, + &resourceDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&mTexture)); + mTexture->SetName(L"Texture"); + hr = pDevice->CreateCommittedResource( + &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + D3D12_HEAP_FLAG_NONE, + &CD3DX12_RESOURCE_DESC::Buffer(required_size), + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&mTextureUpload)); + mTextureUpload->SetName(L"TextureUpload"); + + const int requestedMipLevels = numMipMaps; + D3D12_SUBRESOURCE_DATA* initData = new D3D12_SUBRESOURCE_DATA[requestedMipLevels]; + ZeroMemory(initData, sizeof(D3D12_SUBRESOURCE_DATA)*requestedMipLevels); + + struct Pixel + { + unsigned char rgba[4]; + }; + + // prepare target buffer just large enough to include all the mip levels + Pixel* targets = new Pixel[width*height * 2]; + + // copy the first mip level + memcpy(targets, pSTBIRes, width*height * 4); + + // current mip level width and height + int mipWidth = width; + int mipHeight = height; + + // actual mip levels + int mipLevels = 0; + + // current data + Pixel* source = targets; + Pixel* target = nullptr; + + for (int idx = 0; idx < requestedMipLevels; ++idx) + { + // set initData + initData[idx].pData = source; + initData[idx].RowPitch = mipWidth * 4; + mipLevels++; + + // skip generating mip for 1x1 + if ((mipWidth == 1) && (mipHeight == 1)) + break; + + // skip generating mip for the last level + if (idx == (requestedMipLevels - 1)) + break; + + // buffer for the next mip level + target = &source[mipWidth*mipHeight]; + + const int prevWidth = mipWidth; // previous mip's width + + // generate the next mip level + mipWidth = max(1, mipWidth >> 1); + mipHeight = max(1, mipHeight >> 1); + + Pixel samples[4]; + + for (int y = 0; y < mipHeight; ++y) + { + for (int x = 0; x < mipWidth; ++x) + { + const int px = x * 2; // x in previous mip + const int py = y * 2; // y in previous mip + + samples[0] = source[py*prevWidth + px]; // left top + samples[1] = source[py*prevWidth + px + 1]; // right top + samples[2] = source[(py + 1)*prevWidth + px]; // left bottom + samples[3] = source[(py + 1)*prevWidth + px + 1]; // right bottom + + // for each component + for (int comp = 0; comp < 4; ++comp) + { + // do the linear box filter for lower mip level + target[y*mipWidth + x].rgba[comp] = (samples[0].rgba[comp] + samples[1].rgba[comp] + samples[2].rgba[comp] + samples[3].rgba[comp]) / 4; + } + } + } + + // update source + source = target; + } + + uint8_t* p; + mTextureUpload->Map(0, nullptr, reinterpret_cast<void**>(&p)); + for (uint32_t i = 0; i < numMipMaps; ++i) + { + memcpy(p + layouts[i].Offset, initData[i].pData, layouts[i].Footprint.RowPitch * num_rows[i]); + } + mTextureUpload->Unmap(0, nullptr); + + for (uint32_t i = 0; i < numMipMaps; ++i) + { + D3D12_TEXTURE_COPY_LOCATION src; + src.pResource = mTextureUpload; + src.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + src.PlacedFootprint = layouts[i]; + + D3D12_TEXTURE_COPY_LOCATION dst; + dst.pResource = mTexture; + dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dst.SubresourceIndex = i; + pCommandList->CopyTextureRegion(&dst, 0, 0, 0, &src, nullptr); + } + pCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(mTexture, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE)); + + delete initData; + delete targets; + + int nIndexInHeap = -1; + CD3DX12_CPU_DESCRIPTOR_HANDLE handle = pContext->NVHairINT_CreateD3D12Texture(mTexture, nIndexInHeap); + return D3D12TextureResource::Create(mTexture, handle, nIndexInHeap); +} + + +/////////////////////////////////////////////////////////////////////////////// +bool GetDeviceInfoString(wchar_t *str) +{ + ID3D11Device* pDevice = nullptr;// RenderInterfaceD3D12::GetDevice(); + if (!pDevice) + return false; + + { + IDXGIDevice1 *pDXGIDevice1 = NULL; + pDevice->QueryInterface(__uuidof(IDXGIDevice1), reinterpret_cast<void **>(&pDXGIDevice1)); + + IDXGIAdapter1 *pDXGIAdapter1 = NULL; + pDXGIDevice1->GetParent(__uuidof(IDXGIAdapter1), reinterpret_cast<void **>(&pDXGIAdapter1)); + + if (pDXGIAdapter1) + { + auto adapterDescription = DXGI_ADAPTER_DESC1(); + pDXGIAdapter1->GetDesc1(&adapterDescription); + + WCHAR* pDescStr = adapterDescription.Description; + float memInGB = float(adapterDescription.DedicatedVideoMemory) / 1e9f; + swprintf_s(str, 1000, L"%s(%.1fGb)\n", pDescStr, memInGB); + } + } + + return true; +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Render window interafce +///////////////////////////////////////////////////////////////////////////////////////// +bool CreateRenderWindow(HWND hWnd, int nSamples) +{ + SAFE_DELETE(g_pRenderWindow); + + g_pRenderWindow = new D3D12RenderWindow; + return g_pRenderWindow->Create(hWnd, nSamples); +} + +D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles) +{ + /* + deviceHandles.pAdapter = RenderInterfaceD3D11::GetAdapter(); + deviceHandles.pFactory = RenderInterfaceD3D11::GetDXGIFactory(); + deviceHandles.pDevice = RenderInterfaceD3D11::GetDevice(); + deviceHandles.pDeviceContext = RenderInterfaceD3D11::GetDeviceContext(); + + deviceHandles.pDXGISwapChain = g_pRenderWindow->m_pDXGISwapChain; + deviceHandles.pD3D11BackBuffer = g_pRenderWindow->m_pD3D11BackBuffer; + deviceHandles.pD3D11RenderTargetView = g_pRenderWindow->m_pD3D11RenderTargetView; + deviceHandles.pD3D11DepthBuffer = g_pRenderWindow->m_pD3D11DepthBuffer; + deviceHandles.pD3D11DepthStencilView = g_pRenderWindow->m_pD3D11DepthStencilView; + */ + return deviceHandles; +} + +void DestroyRenderWindow() +{ + SAFE_DELETE(g_pRenderWindow); +} + +bool ResizeRenderWindow(int w, int h) +{ + if (!g_pRenderWindow) + return false; + + return g_pRenderWindow->Resize(w,h); +} + +void PresentRenderWindow() +{ + if (!g_pRenderWindow) + return; + + g_pRenderWindow->Present(); +} + +void ClearRenderWindow(float r, float g, float b) +{ + if (!g_pRenderWindow) + return; + + g_pRenderWindow->Clear(r,g,b); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Text draw helper functions (using DXUT) +///////////////////////////////////////////////////////////////////////////////////////// +void TxtHelperBegin() +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->Begin(); +} + +void TxtHelperEnd() +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->End(); +} + +void TxtHelperSetInsertionPos(int x, int y) +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->SetInsertionPos(x, y); +} + +void TxtHelperSetForegroundColor(float r, float g, float b, float a) +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->SetForegroundColor(DirectX::XMFLOAT4(r,g,b,a)); +} + +void TxtHelperDrawTextLine(wchar_t* str) +{ + if (!g_pRenderWindow || !g_pRenderWindow->m_pTextHelper) + return; + + g_pRenderWindow->m_pTextHelper->DrawTextLine(str); +} + +} // end namespace
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.h new file mode 100644 index 0000000..f83b063 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.h @@ -0,0 +1,68 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include <d3d12.h> + +#include "RenderPlugin.h" + +class GPUShaderResource; + +namespace D3D12Util +{ + /////////////////////////////////////////////////////////////////// + // render window management + /////////////////////////////////////////////////////////////////// + D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles); + bool CreateRenderWindow(HWND hWnd, int nSamples); + void DestroyRenderWindow(); + bool ResizeRenderWindow(int w, int h); + void PresentRenderWindow(); + void ClearRenderWindow(float r, float g, float b); + + /////////////////////////////////////////////////////////////////// + // background textures + bool LoadBackgroundTexture(const char* filePath); + void RenderBackgroundTexture(); + void ClearBackgroundTexture(); + GPUShaderResource* CreateTextureSRV(const char* texturename); + + /////////////////////////////////////////////////////////////////// + bool GetDeviceInfoString(wchar_t *str); + + /////////////////////////////////////////////////////////////////// + // text helpers + void TxtHelperBegin(); + void TxtHelperEnd(); + void TxtHelperSetInsertionPos(int x, int y); + void TxtHelperSetForegroundColor(float r, float g, float b, float a = 1.0f); + void TxtHelperDrawTextLine(wchar_t* str); + + +} diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.cpp new file mode 100644 index 0000000..b534a36 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.cpp @@ -0,0 +1,33 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "D3D12Wrapper.h" + +namespace D3DWrapper +{ + +} // end namespace
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.h new file mode 100644 index 0000000..dc81e34 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.h @@ -0,0 +1,14 @@ +#pragma once + +#include <d3d11.h> + +namespace D3DWrapper +{ + inline void SetDebugName(ID3D11DeviceChild* pResource, const char *name) + { + if (pResource) pResource->SetPrivateData( WKPDID_D3DDebugObjectName, strlen(name), name); + } +} + +#define SET_D3D_DEBUG_NAME(x, name) D3DWrapper::SetDebugName(x, name); +#define SET_D3D_DEBUG_NAME_VAR(x) D3DWrapper::SetDebugName(x, #x); diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.cpp b/tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.cpp new file mode 100644 index 0000000..9945d7c --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.cpp @@ -0,0 +1,343 @@ +#include "RenderPluginDx12.h" + +#include "D3D12RenderInterface.h" +#include "D3D12Util.h" +#include "D3D12Shaders.h" +#include "D3D12GPUProfiler.h" +#include "D3D12ShadowMap.h" +#include "D3D12RenderContext.h" + +RenderPlugin* CreateRenderPlugin(void) +{ + return new RenderPluginDx12; +} + +RenderPluginDx12::RenderPluginDx12() +{ + m_RenderApi = "Dx12"; +} + +RenderPluginDx12::~RenderPluginDx12() +{ +} + +// interface +bool RenderPluginDx12::InitDevice(int deviceID) +{ + return RenderInterfaceD3D12::InitDevice(deviceID); +} + +bool RenderPluginDx12::Initialize() +{ + return RenderInterfaceD3D12::Initialize(); +} + +void RenderPluginDx12::Shutdown() +{ + D3D12Util::DestroyRenderWindow(); + RenderInterfaceD3D12::Shutdown(); +} + +void RenderPluginDx12::CopyToDevice(GPUBufferResource *pDevicePtr, + void* pSysMem, unsigned int ByteWidth) +{ + RenderInterfaceD3D12::CopyToDevice(pDevicePtr, pSysMem, ByteWidth); +} + +void RenderPluginDx12::ApplyDepthStencilState(DEPTH_STENCIL_STATE state) +{ + RenderInterfaceD3D12::ApplyDepthStencilState(state); +} + +void RenderPluginDx12::ApplyRasterizerState(RASTERIZER_STATE state) +{ + RenderInterfaceD3D12::ApplyRasterizerState(state); +} + +void RenderPluginDx12::ApplySampler(int slot, SAMPLER_TYPE state) +{ +} + +void RenderPluginDx12::ApplyBlendState(BLEND_STATE state) +{ + RenderInterfaceD3D12::ApplyBlendState(state); +} + +void RenderPluginDx12::GetViewport(Viewport& vp) +{ + RenderInterfaceD3D12::GetViewport(vp); +} + +void RenderPluginDx12::SetViewport(const Viewport& vp) +{ + RenderInterfaceD3D12::SetViewport(vp); +} + +void RenderPluginDx12::BindVertexShaderResources(int startSlot, + int numSRVs, GPUShaderResource** ppSRVs) +{ +} + +void RenderPluginDx12::BindPixelShaderResources(int startSlot, + int numSRVs, GPUShaderResource** ppSRVs) +{ +} + +void RenderPluginDx12::ClearVertexShaderResources(int startSlot, int numSRVs) +{ +} + +void RenderPluginDx12::ClearPixelShaderResources(int startSlot, int numSRVs) +{ +} + +void RenderPluginDx12::ClearInputLayout() +{ +} + +void RenderPluginDx12::SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset) +{ + RenderInterfaceD3D12::SetVertexBuffer(pBuffer, stride, offset); +} + +void RenderPluginDx12::SetPrimitiveTopologyTriangleStrip() +{ + RenderInterfaceD3D12::SetPrimitiveTopologyTriangleStrip(); +} + +void RenderPluginDx12::SetPrimitiveTopologyTriangleList() +{ + RenderInterfaceD3D12::SetPrimitiveTopologyTriangleList(); +} + +void RenderPluginDx12::SetPrimitiveTopologyLineList() +{ + RenderInterfaceD3D12::SetPrimitiveTopologyLineList(); +} + +void RenderPluginDx12::Draw(unsigned int vertexCount, unsigned int startCount) +{ + RenderInterfaceD3D12::Draw(vertexCount, startCount); +} + +GPUBufferResource* RenderPluginDx12::CreateVertexBuffer(unsigned int ByteWidth, void* pSysMem) +{ + return RenderInterfaceD3D12::CreateVertexBuffer(ByteWidth, pSysMem); +} + +GPUShaderResource* RenderPluginDx12::CreateShaderResource(unsigned int stride, + unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer) +{ + return RenderInterfaceD3D12::CreateShaderResource(stride, numElements, pSysMem, pReadOnlyBuffer); +} + +void RenderPluginDx12::ApplyForShadow(int ForShadow) +{ + RenderInterfaceD3D12::ApplyForShadow(ForShadow); +} + +void RenderPluginDx12::SwitchToDX11() +{ + RenderInterfaceD3D12::SwitchToDX11(); +} + +void RenderPluginDx12::FlushDX11() +{ + RenderInterfaceD3D12::FlushDX11(); +} + +void RenderPluginDx12::FlushDX12() +{ + RenderInterfaceD3D12::FlushDX12(); +} + +void RenderPluginDx12::ApplyPrimitiveTopologyLine() +{ + RenderInterfaceD3D12::ApplyPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE); +} + +void RenderPluginDx12::ApplyPrimitiveTopologyTriangle() +{ + RenderInterfaceD3D12::ApplyPrimitiveTopologyType(D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE); +} + +void RenderPluginDx12::SubmitGpuWork() +{ + RenderInterfaceD3D12::SubmitGpuWork(); +} + +void RenderPluginDx12::WaitForGpu() +{ + RenderInterfaceD3D12::WaitForGpu(); +} + +// util +bool RenderPluginDx12::CreateRenderWindow(HWND hWnd, int nSamples) +{ + return D3D12Util::CreateRenderWindow(hWnd, nSamples); +} + +bool RenderPluginDx12::ResizeRenderWindow(int w, int h) +{ + return D3D12Util::ResizeRenderWindow(w, h); +} + +void RenderPluginDx12::PresentRenderWindow() +{ + D3D12Util::PresentRenderWindow(); +} + +void RenderPluginDx12::ClearRenderWindow(float r, float g, float b) +{ + D3D12Util::ClearRenderWindow(r, g, b); +} + +bool RenderPluginDx12::GetDeviceInfoString(wchar_t *str) +{ + return D3D12Util::GetDeviceInfoString(str); +} + +GPUShaderResource* RenderPluginDx12::CreateTextureSRV(const char* texturename) +{ + return D3D12Util::CreateTextureSRV(texturename); +} + +void RenderPluginDx12::TxtHelperBegin() +{ + D3D12Util::TxtHelperBegin(); +} + +void RenderPluginDx12::TxtHelperEnd() +{ + D3D12Util::TxtHelperEnd(); +} + +void RenderPluginDx12::TxtHelperSetInsertionPos(int x, int y) +{ + D3D12Util::TxtHelperSetInsertionPos(x, y); +} + +void RenderPluginDx12::TxtHelperSetForegroundColor(float r, float g, float b, float a) +{ + D3D12Util::TxtHelperSetForegroundColor(r, g, b, a); +} + +void RenderPluginDx12::TxtHelperDrawTextLine(wchar_t* str) +{ + D3D12Util::TxtHelperDrawTextLine(str); +} + +// shader +bool RenderPluginDx12::InitializeShaders() +{ + return InitializeShadersD3D12(); +} + +void RenderPluginDx12::DestroyShaders() +{ + DestroyShadersD3D12(); +} + +void RenderPluginDx12::ApplyShader(SHADER_TYPE st) +{ + ApplyShaderD3D12(st); +} + +void RenderPluginDx12::DisableShader(SHADER_TYPE st) +{ + DisableShaderD3D12(st); +} + +void RenderPluginDx12::BindShaderResources(SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs) +{ + BindShaderResourcesD3D12(st, numSRVs, ppSRVs); +} + +void RenderPluginDx12::CopyShaderParam(SHADER_TYPE st, + void* pSysMem, unsigned int bytes, unsigned int slot) +{ + CopyShaderParamD3D12(st, pSysMem, bytes, slot); +} + +// GPUProfiler +GPUProfiler* RenderPluginDx12::CreateGPUProfiler() +{ + GPUProfiler* pProfiler = new D3D12GPUProfiler; + pProfiler->Initialize(); + return pProfiler; +} + +// ShadowMap +ShadowMap* RenderPluginDx12::CreateShadowMap(int resolution) +{ + return new D3D12ShadowMap(resolution); +} + +// D3D12RenderContext +void RenderPluginDx12::PreRender() +{ + D3D12RenderContext::Instance()->PreRender(); +} + +void RenderPluginDx12::PostRender() +{ + D3D12RenderContext::Instance()->PostRender(); +} + +// GPUMeshResources +#include "MeshData.h" +#include "AnimUtil.h" + +class GPUMeshResourcesDx12 : public GPUMeshResources +{ +public: + NVHairReadOnlyBuffer m_BoneIndicesBuffer; + NVHairReadOnlyBuffer m_BoneWeightsBuffer; +}; + +GPUMeshResources* RenderPluginDx12::GPUMeshResourcesCreate(MeshData* pMeshData, const SkinData& skinData) +{ + GPUMeshResources* resources = new GPUMeshResourcesDx12; + + int numIndices = pMeshData->m_NumIndices; + int numVertices = pMeshData->m_NumVertices; + + resources->m_pVertexBuffer = CreateVertexBuffer( + sizeof(MeshData::MeshVertex) * numIndices, pMeshData->m_pMeshVertices); + + GPUMeshResourcesDx12* resourceDx12 = (GPUMeshResourcesDx12*)resources; + if (NULL != resourceDx12) + { + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->InitBuffer(resourceDx12->m_BoneIndicesBuffer); + pContext->InitBuffer(resourceDx12->m_BoneWeightsBuffer); + resources->m_pBoneIndicesSRV = CreateShaderResource( + sizeof(atcore_float4), numVertices, skinData.m_pBoneIndices, &resourceDx12->m_BoneIndicesBuffer); + resources->m_pBoneWeightsSRV = CreateShaderResource( + sizeof(atcore_float4), numVertices, skinData.m_pBoneWeights, &resourceDx12->m_BoneWeightsBuffer); + } + + return resources; +} + +void RenderPluginDx12::GPUMeshResourcesRelease(GPUMeshResources* pResource) +{ + SAFE_RELEASE(pResource->m_pVertexBuffer); + SAFE_RELEASE(pResource->m_pBoneIndicesSRV); + SAFE_RELEASE(pResource->m_pBoneWeightsSRV); + + GPUMeshResourcesDx12* pResourceDx12 = (GPUMeshResourcesDx12*)pResource; + if (NULL == pResourceDx12) + { + return; + } + + D3D12RenderContext* pContext = D3D12RenderContext::Instance(); + pContext->DestroyBuffer(pResourceDx12->m_BoneIndicesBuffer); + pContext->DestroyBuffer(pResourceDx12->m_BoneWeightsBuffer); +} + +D3DHandles& RenderPluginDx12::GetDeviceHandles(D3DHandles& deviceHandles) +{ + return D3D12Util::GetDeviceHandles(deviceHandles); +}
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.h b/tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.h new file mode 100644 index 0000000..a88dfbf --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.h @@ -0,0 +1,83 @@ +#pragma once + +#include "RenderPlugin.h" + +extern "C" CORERENDER_EXPORT RenderPlugin* CreateRenderPlugin(void); + +class CORERENDER_EXPORT RenderPluginDx12 : public RenderPlugin +{ +public: + RenderPluginDx12(); + ~RenderPluginDx12(); + + // interface + virtual bool InitDevice(int deviceID); + virtual bool Initialize(); + virtual void Shutdown(); + virtual void CopyToDevice(GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth); + virtual void ApplyDepthStencilState(DEPTH_STENCIL_STATE state); + virtual void ApplyRasterizerState(RASTERIZER_STATE state); + virtual void ApplySampler(int slot, SAMPLER_TYPE st); + virtual void ApplyBlendState(BLEND_STATE st); + virtual void GetViewport(Viewport& vp); + virtual void SetViewport(const Viewport& vp); + virtual void BindVertexShaderResources(int startSlot, int numSRVs, GPUShaderResource** ppSRVs); + virtual void BindPixelShaderResources(int startSlot, int numSRVs, GPUShaderResource** ppSRVs); + virtual void ClearVertexShaderResources(int startSlot, int numSRVs); + virtual void ClearPixelShaderResources(int startSlot, int numSRVs); + virtual void ClearInputLayout(); + virtual void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset = 0); + virtual void SetPrimitiveTopologyTriangleStrip(); + virtual void SetPrimitiveTopologyTriangleList(); + virtual void SetPrimitiveTopologyLineList(); + virtual void Draw(unsigned int vertexCount, unsigned int startCount = 0); + virtual GPUBufferResource* CreateVertexBuffer(unsigned int ByteWidth, void* pSysMem = 0); + virtual GPUShaderResource* CreateShaderResource(unsigned int stride, unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer = NULL); + virtual void ApplyForShadow(int ForShadow); + virtual void SwitchToDX11(); + virtual void FlushDX11(); + virtual void FlushDX12(); + virtual void ApplyPrimitiveTopologyLine(); + virtual void ApplyPrimitiveTopologyTriangle(); + virtual void SubmitGpuWork(); + virtual void WaitForGpu(); + + // util + virtual bool CreateRenderWindow(HWND hWnd, int nSamples); + virtual bool ResizeRenderWindow(int w, int h); + virtual void PresentRenderWindow(); + virtual void ClearRenderWindow(float r, float g, float b); + virtual bool GetDeviceInfoString(wchar_t *str); + virtual GPUShaderResource* CreateTextureSRV(const char* texturename); + virtual void TxtHelperBegin(); + virtual void TxtHelperEnd(); + virtual void TxtHelperSetInsertionPos(int x, int y); + virtual void TxtHelperSetForegroundColor(float r, float g, float b, float a = 1.0f); + virtual void TxtHelperDrawTextLine(wchar_t* str); + + // shader + virtual bool InitializeShaders(); + virtual void DestroyShaders(); + virtual void ApplyShader(SHADER_TYPE st); + virtual void DisableShader(SHADER_TYPE st); + virtual void BindShaderResources(SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs); + virtual void CopyShaderParam(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot = 0); + + // GPUProfiler + virtual GPUProfiler* CreateGPUProfiler(); + + // ShadowMap + virtual ShadowMap* CreateShadowMap(int resolution); + + // D3D12RenderContext + virtual void PreRender(); + virtual void PostRender(); + + // GPUMeshResources + virtual GPUMeshResources* GPUMeshResourcesCreate(MeshData* pMeshData, const SkinData& skinData); + virtual void GPUMeshResourcesRelease(GPUMeshResources* pResource); + + // Get devices related + virtual D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles); +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/GPUProfiler.cpp b/tools/ArtistTools/source/CoreLib/Render/GPUProfiler.cpp new file mode 100644 index 0000000..08a3497 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/GPUProfiler.cpp @@ -0,0 +1,87 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "GPUProfiler.h" + +#include "RenderPlugin.h" + +#ifndef SAFE_DELETE +#define SAFE_DELETE(x) {if(x){delete x; x=nullptr;}} +#endif + +GPUProfiler* g_pGPUProfiler = 0; + +void GPUProfiler_Initialize() +{ + g_pGPUProfiler = RenderPlugin::Instance()->CreateGPUProfiler(); +} + +void GPUProfiler_Shutdown() +{ + SAFE_DELETE(g_pGPUProfiler); +} + +void GPUProfiler_Enable(bool b) +{ + if (g_pGPUProfiler) + g_pGPUProfiler->Enable(b); +} + +void GPUProfiler_StartFrame() +{ + if (g_pGPUProfiler) + g_pGPUProfiler->StartFrame(); +} + +void GPUProfiler_EndFrame() +{ + if (g_pGPUProfiler) + g_pGPUProfiler->EndFrame(); +} + +void GPUProfiler_StartProfile(int id) +{ + if (g_pGPUProfiler) + g_pGPUProfiler->StartProfile(id); +} + +void GPUProfiler_EndProfile(int id) +{ + if (g_pGPUProfiler) + g_pGPUProfiler->EndProfile(id); +} + +float GPUProfiler_GetProfileData(int id) +{ + if (!g_pGPUProfiler) + return 0; + + return g_pGPUProfiler->GetProfileData(id); +} + + + diff --git a/tools/ArtistTools/source/CoreLib/Render/GPUProfiler.h b/tools/ArtistTools/source/CoreLib/Render/GPUProfiler.h new file mode 100644 index 0000000..65bb602 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/GPUProfiler.h @@ -0,0 +1,61 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "corelib_global.h" + +struct CORELIB_EXPORT GPUProfiler +{ + bool m_enable; + +public: + // define base class virtual destructor to make sure child classes call destructor right. + virtual ~GPUProfiler() {} + + void Enable(bool b) { m_enable = b; } + + virtual void Initialize() = 0; + virtual void Release() = 0; + virtual void StartFrame() = 0; + virtual void EndFrame() = 0; + virtual void StartProfile(int id) = 0; + virtual void EndProfile(int id) = 0; + virtual float GetProfileData(int id) = 0; +}; + +// helper functions +CORELIB_EXPORT void GPUProfiler_Initialize(); +CORELIB_EXPORT void GPUProfiler_Enable(bool); +CORELIB_EXPORT void GPUProfiler_Shutdown(); +CORELIB_EXPORT void GPUProfiler_StartFrame(); +CORELIB_EXPORT void GPUProfiler_EndFrame(); +CORELIB_EXPORT void GPUProfiler_StartProfile(int id); +CORELIB_EXPORT void GPUProfiler_EndProfile(int id); +CORELIB_EXPORT float GPUProfiler_GetProfileData(int id); + diff --git a/tools/ArtistTools/source/CoreLib/Render/GeometryData/BoneGeometryData.h b/tools/ArtistTools/source/CoreLib/Render/GeometryData/BoneGeometryData.h new file mode 100644 index 0000000..4a6ea37 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/GeometryData/BoneGeometryData.h @@ -0,0 +1,305 @@ +const int num_faces = 100; + +// pos.xyz, uv.uv, normal.xyz +float vertices[100*3*8] = { +0.250000, -0.951057, -0.181636, 0.000000, 0.900000, 0.277578, -0.881468, -0.382053, +0.095491, -0.951057, -0.293893, 0.100000, 0.900000, 0.277578, -0.881468, -0.382053, +0.181636, -0.809017, -0.559017, 0.100000, 0.800000, 0.277578, -0.881468, -0.382053, +0.095491, -0.951057, -0.293893, 0.100000, 0.900000, -0.000000, -0.881468, -0.472244, +-0.095492, -0.951057, -0.293893, 0.200000, 0.900000, -0.000000, -0.881468, -0.472244, +-0.181636, -0.809017, -0.559017, 0.200000, 0.800000, -0.000000, -0.881468, -0.472244, +-0.095492, -0.951057, -0.293893, 0.200000, 0.900000, -0.277578, -0.881468, -0.382053, +-0.250000, -0.951057, -0.181636, 0.300000, 0.900000, -0.277578, -0.881468, -0.382053, +-0.475528, -0.809017, -0.345491, 0.300000, 0.800000, -0.277578, -0.881468, -0.382053, +-0.250000, -0.951057, -0.181636, 0.300000, 0.900000, -0.449130, -0.881468, -0.145931, +-0.309017, -0.951057, 0.000000, 0.400000, 0.900000, -0.449130, -0.881468, -0.145931, +-0.587785, -0.809017, 0.000000, 0.400000, 0.800000, -0.449130, -0.881468, -0.145931, +-0.309017, -0.951057, 0.000000, 0.400000, 0.900000, -0.449130, -0.881468, 0.145931, +-0.250000, -0.951057, 0.181636, 0.500000, 0.900000, -0.449130, -0.881468, 0.145931, +-0.475528, -0.809017, 0.345492, 0.500000, 0.800000, -0.449130, -0.881468, 0.145931, +-0.250000, -0.951057, 0.181636, 0.500000, 0.900000, -0.277578, -0.881468, 0.382053, +-0.095491, -0.951057, 0.293893, 0.600000, 0.900000, -0.277578, -0.881468, 0.382053, +-0.181636, -0.809017, 0.559017, 0.600000, 0.800000, -0.277578, -0.881468, 0.382053, +-0.095491, -0.951057, 0.293893, 0.600000, 0.900000, 0.000000, -0.881468, 0.472244, +0.095492, -0.951057, 0.293893, 0.700000, 0.900000, 0.000000, -0.881468, 0.472244, +0.181636, -0.809017, 0.559017, 0.700000, 0.800000, 0.000000, -0.881468, 0.472244, +0.095492, -0.951057, 0.293893, 0.700000, 0.900000, 0.277578, -0.881468, 0.382053, +0.250000, -0.951057, 0.181636, 0.800000, 0.900000, 0.277578, -0.881468, 0.382053, +0.475528, -0.809017, 0.345491, 0.800000, 0.800000, 0.277578, -0.881468, 0.382053, +0.250000, -0.951057, 0.181636, 0.800000, 0.900000, 0.449130, -0.881468, 0.145931, +0.309017, -0.951057, 0.000000, 0.900000, 0.900000, 0.449130, -0.881468, 0.145931, +0.587785, -0.809017, 0.000000, 0.900000, 0.800000, 0.449131, -0.881468, 0.145931, +0.309017, -0.951057, 0.000000, 0.900000, 0.900000, 0.449131, -0.881468, -0.145931, +0.250000, -0.951057, -0.181636, 1.000000, 0.900000, 0.449131, -0.881468, -0.145931, +0.475528, -0.809017, -0.345492, 1.000000, 0.800000, 0.449131, -0.881468, -0.145931, +0.475528, -0.809017, -0.345492, 0.000000, 0.800000, 0.425919, -0.689152, -0.586227, +0.181636, -0.809017, -0.559017, 0.100000, 0.800000, 0.425919, -0.689152, -0.586227, +0.250000, -0.587785, -0.769421, 0.100000, 0.700000, 0.425919, -0.689152, -0.586227, +0.181636, -0.809017, -0.559017, 0.100000, 0.800000, -0.000000, -0.689152, -0.724617, +-0.181636, -0.809017, -0.559017, 0.200000, 0.800000, -0.000000, -0.689152, -0.724617, +-0.250000, -0.587785, -0.769421, 0.200000, 0.700000, -0.000000, -0.689152, -0.724617, +-0.181636, -0.809017, -0.559017, 0.200000, 0.800000, -0.425919, -0.689152, -0.586228, +-0.475528, -0.809017, -0.345491, 0.300000, 0.800000, -0.425919, -0.689152, -0.586228, +-0.654509, -0.587785, -0.475528, 0.300000, 0.700000, -0.425919, -0.689152, -0.586228, +-0.475528, -0.809017, -0.345491, 0.300000, 0.800000, -0.689152, -0.689152, -0.223919, +-0.587785, -0.809017, 0.000000, 0.400000, 0.800000, -0.689152, -0.689152, -0.223919, +-0.809017, -0.587785, 0.000000, 0.400000, 0.700000, -0.689152, -0.689152, -0.223919, +-0.587785, -0.809017, 0.000000, 0.400000, 0.800000, -0.689152, -0.689152, 0.223919, +-0.475528, -0.809017, 0.345492, 0.500000, 0.800000, -0.689152, -0.689152, 0.223919, +-0.654509, -0.587785, 0.475528, 0.500000, 0.700000, -0.689152, -0.689152, 0.223919, +-0.475528, -0.809017, 0.345492, 0.500000, 0.800000, -0.425919, -0.689152, 0.586228, +-0.181636, -0.809017, 0.559017, 0.600000, 0.800000, -0.425919, -0.689152, 0.586228, +-0.250000, -0.587785, 0.769421, 0.600000, 0.700000, -0.425919, -0.689152, 0.586228, +-0.181636, -0.809017, 0.559017, 0.600000, 0.800000, 0.000000, -0.689152, 0.724617, +0.181636, -0.809017, 0.559017, 0.700000, 0.800000, 0.000000, -0.689152, 0.724617, +0.250000, -0.587785, 0.769421, 0.700000, 0.700000, 0.000000, -0.689152, 0.724617, +0.181636, -0.809017, 0.559017, 0.700000, 0.800000, 0.425919, -0.689152, 0.586227, +0.475528, -0.809017, 0.345491, 0.800000, 0.800000, 0.425919, -0.689152, 0.586227, +0.654509, -0.587785, 0.475528, 0.800000, 0.700000, 0.425919, -0.689152, 0.586227, +0.475528, -0.809017, 0.345491, 0.800000, 0.800000, 0.689152, -0.689152, 0.223919, +0.587785, -0.809017, 0.000000, 0.900000, 0.800000, 0.689152, -0.689152, 0.223919, +0.809017, -0.587785, 0.000000, 0.900000, 0.700000, 0.689152, -0.689152, 0.223919, +0.587785, -0.809017, 0.000000, 0.900000, 0.800000, 0.689152, -0.689152, -0.223919, +0.475528, -0.809017, -0.345492, 1.000000, 0.800000, 0.689152, -0.689152, -0.223919, +0.654509, -0.587785, -0.475528, 1.000000, 0.700000, 0.689152, -0.689152, -0.223919, +0.654509, -0.587785, -0.475528, 0.000000, 0.700000, 0.528952, -0.436083, -0.728040, +0.250000, -0.587785, -0.769421, 0.100000, 0.700000, 0.528952, -0.436083, -0.728040, +0.293893, -0.309017, -0.904509, 0.100000, 0.600000, 0.528952, -0.436083, -0.728040, +0.250000, -0.587785, -0.769421, 0.100000, 0.700000, -0.000000, -0.436083, -0.899906, +-0.250000, -0.587785, -0.769421, 0.200000, 0.700000, -0.000000, -0.436083, -0.899906, +-0.293893, -0.309017, -0.904509, 0.200000, 0.600000, -0.000000, -0.436083, -0.899906, +-0.250000, -0.587785, -0.769421, 0.200000, 0.700000, -0.528952, -0.436083, -0.728040, +-0.654509, -0.587785, -0.475528, 0.300000, 0.700000, -0.528952, -0.436083, -0.728040, +-0.769421, -0.309017, -0.559017, 0.300000, 0.600000, -0.528952, -0.436083, -0.728040, +-0.654509, -0.587785, -0.475528, 0.300000, 0.700000, -0.855862, -0.436083, -0.278086, +-0.809017, -0.587785, 0.000000, 0.400000, 0.700000, -0.855862, -0.436083, -0.278086, +-0.951057, -0.309017, 0.000000, 0.400000, 0.600000, -0.855862, -0.436083, -0.278086, +-0.809017, -0.587785, 0.000000, 0.400000, 0.700000, -0.855862, -0.436083, 0.278086, +-0.654509, -0.587785, 0.475528, 0.500000, 0.700000, -0.855862, -0.436083, 0.278086, +-0.769421, -0.309017, 0.559017, 0.500000, 0.600000, -0.855862, -0.436083, 0.278086, +-0.654509, -0.587785, 0.475528, 0.500000, 0.700000, -0.528952, -0.436083, 0.728040, +-0.250000, -0.587785, 0.769421, 0.600000, 0.700000, -0.528952, -0.436083, 0.728039, +-0.293893, -0.309017, 0.904509, 0.600000, 0.600000, -0.528952, -0.436083, 0.728039, +-0.250000, -0.587785, 0.769421, 0.600000, 0.700000, 0.000000, -0.436083, 0.899906, +0.250000, -0.587785, 0.769421, 0.700000, 0.700000, 0.000000, -0.436083, 0.899906, +0.293893, -0.309017, 0.904509, 0.700000, 0.600000, 0.000000, -0.436083, 0.899906, +0.250000, -0.587785, 0.769421, 0.700000, 0.700000, 0.528952, -0.436083, 0.728039, +0.654509, -0.587785, 0.475528, 0.800000, 0.700000, 0.528952, -0.436083, 0.728040, +0.769421, -0.309017, 0.559017, 0.800000, 0.600000, 0.528952, -0.436083, 0.728040, +0.654509, -0.587785, 0.475528, 0.800000, 0.700000, 0.855862, -0.436083, 0.278086, +0.809017, -0.587785, 0.000000, 0.900000, 0.700000, 0.855862, -0.436083, 0.278086, +0.951057, -0.309017, 0.000000, 0.900000, 0.600000, 0.855862, -0.436083, 0.278086, +0.809017, -0.587785, 0.000000, 0.900000, 0.700000, 0.855862, -0.436084, -0.278086, +0.654509, -0.587785, -0.475528, 1.000000, 0.700000, 0.855862, -0.436084, -0.278086, +0.769421, -0.309017, -0.559017, 1.000000, 0.600000, 0.855862, -0.436084, -0.278086, +0.769421, -0.309017, -0.559017, 0.000000, 0.600000, 0.581228, -0.148952, -0.799992, +0.293893, -0.309017, -0.904509, 0.100000, 0.600000, 0.581228, -0.148952, -0.799992, +0.309017, 0.000000, -0.951057, 0.100000, 0.500000, 0.581228, -0.148952, -0.799992, +0.293893, -0.309017, -0.904509, 0.100000, 0.600000, -0.000000, -0.148952, -0.988844, +-0.293893, -0.309017, -0.904509, 0.200000, 0.600000, -0.000000, -0.148952, -0.988844, +-0.309017, 0.000000, -0.951057, 0.200000, 0.500000, -0.000000, -0.148952, -0.988844, +-0.293893, -0.309017, -0.904509, 0.200000, 0.600000, -0.581228, -0.148952, -0.799992, +-0.769421, -0.309017, -0.559017, 0.300000, 0.600000, -0.581228, -0.148952, -0.799992, +-0.809017, 0.000000, -0.587785, 0.300000, 0.500000, -0.581228, -0.148952, -0.799992, +-0.769421, -0.309017, -0.559017, 0.300000, 0.600000, -0.940447, -0.148952, -0.305570, +-0.951057, -0.309017, 0.000000, 0.400000, 0.600000, -0.940447, -0.148952, -0.305570, +-1.000000, 0.000000, 0.000000, 0.400000, 0.500000, -0.940447, -0.148952, -0.305570, +-0.951057, -0.309017, 0.000000, 0.400000, 0.600000, -0.940447, -0.148952, 0.305570, +-0.769421, -0.309017, 0.559017, 0.500000, 0.600000, -0.940447, -0.148952, 0.305570, +-0.809017, 0.000000, 0.587785, 0.500000, 0.500000, -0.940447, -0.148952, 0.305570, +-0.769421, -0.309017, 0.559017, 0.500000, 0.600000, -0.581228, -0.148952, 0.799992, +-0.293893, -0.309017, 0.904509, 0.600000, 0.600000, -0.581228, -0.148952, 0.799992, +-0.309017, 0.000000, 0.951057, 0.600000, 0.500000, -0.581228, -0.148952, 0.799992, +-0.293893, -0.309017, 0.904509, 0.600000, 0.600000, 0.000000, -0.148952, 0.988844, +0.293893, -0.309017, 0.904509, 0.700000, 0.600000, 0.000000, -0.148952, 0.988844, +0.309017, 0.000000, 0.951057, 0.700000, 0.500000, 0.000000, -0.148952, 0.988844, +0.293893, -0.309017, 0.904509, 0.700000, 0.600000, 0.581228, -0.148952, 0.799992, +0.769421, -0.309017, 0.559017, 0.800000, 0.600000, 0.581228, -0.148952, 0.799992, +0.809017, 0.000000, 0.587785, 0.800000, 0.500000, 0.581228, -0.148952, 0.799992, +0.769421, -0.309017, 0.559017, 0.800000, 0.600000, 0.940447, -0.148952, 0.305570, +0.951057, -0.309017, 0.000000, 0.900000, 0.600000, 0.940447, -0.148952, 0.305570, +1.000000, 0.000000, 0.000000, 0.900000, 0.500000, 0.940447, -0.148952, 0.305570, +0.951057, -0.309017, 0.000000, 0.900000, 0.600000, 0.940447, -0.148952, -0.305570, +0.769421, -0.309017, -0.559017, 1.000000, 0.600000, 0.940447, -0.148952, -0.305570, +0.809017, 0.000000, -0.587785, 1.000000, 0.500000, 0.940447, -0.148952, -0.305570, +0.809017, 0.000000, -0.587785, 0.000000, 0.500000, 0.581228, 0.148952, -0.799992, +0.309017, 0.000000, -0.951057, 0.100000, 0.500000, 0.581228, 0.148952, -0.799992, +0.293893, 0.309017, -0.904509, 0.100000, 0.400000, 0.581228, 0.148952, -0.799992, +0.309017, 0.000000, -0.951057, 0.100000, 0.500000, -0.000000, 0.148952, -0.988844, +-0.309017, 0.000000, -0.951057, 0.200000, 0.500000, -0.000000, 0.148952, -0.988844, +-0.293893, 0.309017, -0.904509, 0.200000, 0.400000, -0.000000, 0.148952, -0.988844, +-0.309017, 0.000000, -0.951057, 0.200000, 0.500000, -0.581228, 0.148952, -0.799992, +-0.809017, 0.000000, -0.587785, 0.300000, 0.500000, -0.581228, 0.148952, -0.799992, +-0.769421, 0.309017, -0.559017, 0.300000, 0.400000, -0.581228, 0.148952, -0.799992, +-0.809017, 0.000000, -0.587785, 0.300000, 0.500000, -0.940447, 0.148952, -0.305570, +-1.000000, 0.000000, 0.000000, 0.400000, 0.500000, -0.940447, 0.148952, -0.305570, +-0.951057, 0.309017, 0.000000, 0.400000, 0.400000, -0.940447, 0.148952, -0.305570, +-1.000000, 0.000000, 0.000000, 0.400000, 0.500000, -0.940447, 0.148952, 0.305570, +-0.809017, 0.000000, 0.587785, 0.500000, 0.500000, -0.940447, 0.148952, 0.305570, +-0.769421, 0.309017, 0.559017, 0.500000, 0.400000, -0.940447, 0.148952, 0.305570, +-0.809017, 0.000000, 0.587785, 0.500000, 0.500000, -0.581228, 0.148952, 0.799992, +-0.309017, 0.000000, 0.951057, 0.600000, 0.500000, -0.581228, 0.148952, 0.799992, +-0.293893, 0.309017, 0.904509, 0.600000, 0.400000, -0.581228, 0.148952, 0.799992, +-0.309017, 0.000000, 0.951057, 0.600000, 0.500000, 0.000000, 0.148952, 0.988844, +0.309017, 0.000000, 0.951057, 0.700000, 0.500000, 0.000000, 0.148952, 0.988844, +0.293893, 0.309017, 0.904509, 0.700000, 0.400000, 0.000000, 0.148952, 0.988844, +0.309017, 0.000000, 0.951057, 0.700000, 0.500000, 0.581228, 0.148952, 0.799992, +0.809017, 0.000000, 0.587785, 0.800000, 0.500000, 0.581228, 0.148952, 0.799992, +0.769421, 0.309017, 0.559017, 0.800000, 0.400000, 0.581228, 0.148952, 0.799992, +0.809017, 0.000000, 0.587785, 0.800000, 0.500000, 0.940447, 0.148952, 0.305570, +1.000000, 0.000000, 0.000000, 0.900000, 0.500000, 0.940447, 0.148952, 0.305570, +0.951057, 0.309017, 0.000000, 0.900000, 0.400000, 0.940447, 0.148952, 0.305570, +1.000000, 0.000000, 0.000000, 0.900000, 0.500000, 0.940447, 0.148952, -0.305570, +0.809017, 0.000000, -0.587785, 1.000000, 0.500000, 0.940447, 0.148952, -0.305570, +0.769421, 0.309017, -0.559017, 1.000000, 0.400000, 0.940447, 0.148952, -0.305569, +0.769421, 0.309017, -0.559017, 0.000000, 0.400000, 0.528952, 0.436083, -0.728040, +0.293893, 0.309017, -0.904509, 0.100000, 0.400000, 0.528952, 0.436083, -0.728040, +0.250000, 0.587785, -0.769421, 0.100000, 0.300000, 0.528952, 0.436083, -0.728040, +0.293893, 0.309017, -0.904509, 0.100000, 0.400000, -0.000000, 0.436083, -0.899906, +-0.293893, 0.309017, -0.904509, 0.200000, 0.400000, -0.000000, 0.436083, -0.899906, +-0.250000, 0.587785, -0.769421, 0.200000, 0.300000, -0.000000, 0.436083, -0.899906, +-0.293893, 0.309017, -0.904509, 0.200000, 0.400000, -0.528952, 0.436083, -0.728039, +-0.769421, 0.309017, -0.559017, 0.300000, 0.400000, -0.528952, 0.436083, -0.728039, +-0.654509, 0.587785, -0.475528, 0.300000, 0.300000, -0.528952, 0.436083, -0.728039, +-0.769421, 0.309017, -0.559017, 0.300000, 0.400000, -0.855862, 0.436083, -0.278086, +-0.951057, 0.309017, 0.000000, 0.400000, 0.400000, -0.855862, 0.436083, -0.278086, +-0.809017, 0.587785, 0.000000, 0.400000, 0.300000, -0.855862, 0.436083, -0.278086, +-0.951057, 0.309017, 0.000000, 0.400000, 0.400000, -0.855862, 0.436083, 0.278086, +-0.769421, 0.309017, 0.559017, 0.500000, 0.400000, -0.855862, 0.436083, 0.278086, +-0.654509, 0.587785, 0.475528, 0.500000, 0.300000, -0.855862, 0.436083, 0.278086, +-0.769421, 0.309017, 0.559017, 0.500000, 0.400000, -0.528952, 0.436083, 0.728039, +-0.293893, 0.309017, 0.904509, 0.600000, 0.400000, -0.528952, 0.436083, 0.728039, +-0.250000, 0.587785, 0.769421, 0.600000, 0.300000, -0.528952, 0.436083, 0.728039, +-0.293893, 0.309017, 0.904509, 0.600000, 0.400000, 0.000000, 0.436083, 0.899906, +0.293893, 0.309017, 0.904509, 0.700000, 0.400000, 0.000000, 0.436083, 0.899906, +0.250000, 0.587785, 0.769421, 0.700000, 0.300000, 0.000000, 0.436083, 0.899906, +0.293893, 0.309017, 0.904509, 0.700000, 0.400000, 0.528952, 0.436083, 0.728040, +0.769421, 0.309017, 0.559017, 0.800000, 0.400000, 0.528952, 0.436083, 0.728040, +0.654509, 0.587785, 0.475528, 0.800000, 0.300000, 0.528952, 0.436083, 0.728040, +0.769421, 0.309017, 0.559017, 0.800000, 0.400000, 0.855862, 0.436083, 0.278086, +0.951057, 0.309017, 0.000000, 0.900000, 0.400000, 0.855862, 0.436083, 0.278086, +0.809017, 0.587785, 0.000000, 0.900000, 0.300000, 0.855862, 0.436083, 0.278086, +0.951057, 0.309017, 0.000000, 0.900000, 0.400000, 0.855862, 0.436084, -0.278086, +0.769421, 0.309017, -0.559017, 1.000000, 0.400000, 0.855862, 0.436084, -0.278086, +0.654509, 0.587785, -0.475528, 1.000000, 0.300000, 0.855862, 0.436084, -0.278086, +0.654509, 0.587785, -0.475528, 0.000000, 0.300000, 0.425919, 0.689152, -0.586227, +0.250000, 0.587785, -0.769421, 0.100000, 0.300000, 0.425919, 0.689152, -0.586227, +0.181636, 0.809017, -0.559017, 0.100000, 0.200000, 0.425919, 0.689152, -0.586227, +0.250000, 0.587785, -0.769421, 0.100000, 0.300000, -0.000000, 0.689152, -0.724617, +-0.250000, 0.587785, -0.769421, 0.200000, 0.300000, -0.000000, 0.689152, -0.724617, +-0.181636, 0.809017, -0.559017, 0.200000, 0.200000, -0.000000, 0.689152, -0.724617, +-0.250000, 0.587785, -0.769421, 0.200000, 0.300000, -0.425919, 0.689152, -0.586227, +-0.654509, 0.587785, -0.475528, 0.300000, 0.300000, -0.425919, 0.689152, -0.586227, +-0.475528, 0.809017, -0.345491, 0.300000, 0.200000, -0.425919, 0.689152, -0.586227, +-0.654509, 0.587785, -0.475528, 0.300000, 0.300000, -0.689152, 0.689152, -0.223919, +-0.809017, 0.587785, 0.000000, 0.400000, 0.300000, -0.689152, 0.689152, -0.223919, +-0.587785, 0.809017, 0.000000, 0.400000, 0.200000, -0.689152, 0.689152, -0.223919, +-0.809017, 0.587785, 0.000000, 0.400000, 0.300000, -0.689152, 0.689152, 0.223919, +-0.654509, 0.587785, 0.475528, 0.500000, 0.300000, -0.689152, 0.689152, 0.223919, +-0.475528, 0.809017, 0.345492, 0.500000, 0.200000, -0.689152, 0.689152, 0.223919, +-0.654509, 0.587785, 0.475528, 0.500000, 0.300000, -0.425919, 0.689152, 0.586228, +-0.250000, 0.587785, 0.769421, 0.600000, 0.300000, -0.425919, 0.689152, 0.586228, +-0.181636, 0.809017, 0.559017, 0.600000, 0.200000, -0.425919, 0.689152, 0.586228, +-0.250000, 0.587785, 0.769421, 0.600000, 0.300000, 0.000000, 0.689152, 0.724617, +0.250000, 0.587785, 0.769421, 0.700000, 0.300000, 0.000000, 0.689152, 0.724617, +0.181636, 0.809017, 0.559017, 0.700000, 0.200000, 0.000000, 0.689152, 0.724617, +0.250000, 0.587785, 0.769421, 0.700000, 0.300000, 0.425919, 0.689152, 0.586227, +0.654509, 0.587785, 0.475528, 0.800000, 0.300000, 0.425919, 0.689152, 0.586227, +0.475528, 0.809017, 0.345491, 0.800000, 0.200000, 0.425919, 0.689152, 0.586227, +0.654509, 0.587785, 0.475528, 0.800000, 0.300000, 0.689152, 0.689152, 0.223919, +0.809017, 0.587785, 0.000000, 0.900000, 0.300000, 0.689152, 0.689152, 0.223919, +0.587785, 0.809017, 0.000000, 0.900000, 0.200000, 0.689152, 0.689152, 0.223919, +0.809017, 0.587785, 0.000000, 0.900000, 0.300000, 0.689152, 0.689152, -0.223919, +0.654509, 0.587785, -0.475528, 1.000000, 0.300000, 0.689152, 0.689152, -0.223919, +0.475528, 0.809017, -0.345492, 1.000000, 0.200000, 0.689152, 0.689152, -0.223919, +0.475528, 0.809017, -0.345492, 0.000000, 0.200000, 0.277578, 0.881468, -0.382053, +0.181636, 0.809017, -0.559017, 0.100000, 0.200000, 0.277578, 0.881468, -0.382053, +0.095491, 0.951057, -0.293893, 0.100000, 0.100000, 0.277578, 0.881468, -0.382053, +0.181636, 0.809017, -0.559017, 0.100000, 0.200000, -0.000000, 0.881468, -0.472244, +-0.181636, 0.809017, -0.559017, 0.200000, 0.200000, -0.000000, 0.881468, -0.472244, +-0.095492, 0.951057, -0.293893, 0.200000, 0.100000, -0.000000, 0.881468, -0.472244, +-0.181636, 0.809017, -0.559017, 0.200000, 0.200000, -0.277578, 0.881468, -0.382053, +-0.475528, 0.809017, -0.345491, 0.300000, 0.200000, -0.277578, 0.881468, -0.382053, +-0.250000, 0.951057, -0.181636, 0.300000, 0.100000, -0.277578, 0.881468, -0.382053, +-0.475528, 0.809017, -0.345491, 0.300000, 0.200000, -0.449130, 0.881468, -0.145931, +-0.587785, 0.809017, 0.000000, 0.400000, 0.200000, -0.449130, 0.881468, -0.145931, +-0.309017, 0.951057, 0.000000, 0.400000, 0.100000, -0.449130, 0.881468, -0.145931, +-0.587785, 0.809017, 0.000000, 0.400000, 0.200000, -0.449130, 0.881468, 0.145931, +-0.475528, 0.809017, 0.345492, 0.500000, 0.200000, -0.449130, 0.881468, 0.145931, +-0.250000, 0.951057, 0.181636, 0.500000, 0.100000, -0.449131, 0.881468, 0.145931, +-0.475528, 0.809017, 0.345492, 0.500000, 0.200000, -0.277578, 0.881468, 0.382053, +-0.181636, 0.809017, 0.559017, 0.600000, 0.200000, -0.277578, 0.881468, 0.382053, +-0.095491, 0.951057, 0.293893, 0.600000, 0.100000, -0.277578, 0.881468, 0.382053, +-0.181636, 0.809017, 0.559017, 0.600000, 0.200000, 0.000000, 0.881468, 0.472244, +0.181636, 0.809017, 0.559017, 0.700000, 0.200000, 0.000000, 0.881468, 0.472244, +0.095492, 0.951057, 0.293893, 0.700000, 0.100000, 0.000000, 0.881468, 0.472244, +0.181636, 0.809017, 0.559017, 0.700000, 0.200000, 0.277578, 0.881468, 0.382053, +0.475528, 0.809017, 0.345491, 0.800000, 0.200000, 0.277578, 0.881468, 0.382053, +0.250000, 0.951057, 0.181636, 0.800000, 0.100000, 0.277578, 0.881468, 0.382053, +0.475528, 0.809017, 0.345491, 0.800000, 0.200000, 0.449131, 0.881468, 0.145931, +0.587785, 0.809017, 0.000000, 0.900000, 0.200000, 0.449131, 0.881468, 0.145931, +0.309017, 0.951057, 0.000000, 0.900000, 0.100000, 0.449130, 0.881468, 0.145931, +0.587785, 0.809017, 0.000000, 0.900000, 0.200000, 0.449131, 0.881468, -0.145931, +0.475528, 0.809017, -0.345492, 1.000000, 0.200000, 0.449131, 0.881468, -0.145931, +0.250000, 0.951057, -0.181636, 1.000000, 0.100000, 0.449131, 0.881468, -0.145931, +0.095491, -0.951057, -0.293893, 0.100000, 0.900000, 0.096557, -0.986415, -0.132899, +0.250000, -0.951057, -0.181636, 0.000000, 0.900000, 0.096557, -0.986415, -0.132899, +0.000000, -1.000000, 0.000000, 0.050000, 1.000000, 0.096557, -0.986415, -0.132899, +-0.095492, -0.951057, -0.293893, 0.200000, 0.900000, -0.000000, -0.986415, -0.164272, +0.095491, -0.951057, -0.293893, 0.100000, 0.900000, -0.000000, -0.986415, -0.164272, +0.000000, -1.000000, 0.000000, 0.150000, 1.000000, -0.000000, -0.986415, -0.164272, +-0.250000, -0.951057, -0.181636, 0.300000, 0.900000, -0.096557, -0.986415, -0.132899, +-0.095492, -0.951057, -0.293893, 0.200000, 0.900000, -0.096557, -0.986415, -0.132899, +0.000000, -1.000000, 0.000000, 0.250000, 1.000000, -0.096557, -0.986415, -0.132899, +-0.309017, -0.951057, 0.000000, 0.400000, 0.900000, -0.156233, -0.986415, -0.050763, +-0.250000, -0.951057, -0.181636, 0.300000, 0.900000, -0.156233, -0.986415, -0.050763, +0.000000, -1.000000, 0.000000, 0.350000, 1.000000, -0.156233, -0.986415, -0.050763, +-0.250000, -0.951057, 0.181636, 0.500000, 0.900000, -0.156233, -0.986415, 0.050763, +-0.309017, -0.951057, 0.000000, 0.400000, 0.900000, -0.156233, -0.986415, 0.050763, +0.000000, -1.000000, 0.000000, 0.450000, 1.000000, -0.156233, -0.986415, 0.050763, +-0.095491, -0.951057, 0.293893, 0.600000, 0.900000, -0.096557, -0.986415, 0.132899, +-0.250000, -0.951057, 0.181636, 0.500000, 0.900000, -0.096557, -0.986415, 0.132899, +0.000000, -1.000000, 0.000000, 0.550000, 1.000000, -0.096557, -0.986415, 0.132899, +0.095492, -0.951057, 0.293893, 0.700000, 0.900000, 0.000000, -0.986415, 0.164272, +-0.095491, -0.951057, 0.293893, 0.600000, 0.900000, 0.000000, -0.986415, 0.164272, +0.000000, -1.000000, 0.000000, 0.650000, 1.000000, 0.000000, -0.986415, 0.164272, +0.250000, -0.951057, 0.181636, 0.800000, 0.900000, 0.096557, -0.986415, 0.132899, +0.095492, -0.951057, 0.293893, 0.700000, 0.900000, 0.096557, -0.986415, 0.132899, +0.000000, -1.000000, 0.000000, 0.750000, 1.000000, 0.096557, -0.986415, 0.132899, +0.309017, -0.951057, 0.000000, 0.900000, 0.900000, 0.156233, -0.986415, 0.050763, +0.250000, -0.951057, 0.181636, 0.800000, 0.900000, 0.156233, -0.986415, 0.050763, +0.000000, -1.000000, 0.000000, 0.850000, 1.000000, 0.156233, -0.986415, 0.050763, +0.250000, -0.951057, -0.181636, 1.000000, 0.900000, 0.156233, -0.986415, -0.050763, +0.309017, -0.951057, 0.000000, 0.900000, 0.900000, 0.156233, -0.986415, -0.050763, +0.000000, -1.000000, 0.000000, 0.950000, 1.000000, 0.156233, -0.986415, -0.050763, +0.250000, 0.951057, -0.181636, 0.000000, 0.100000, 0.096557, 0.986415, -0.132899, +0.095491, 0.951057, -0.293893, 0.100000, 0.100000, 0.096557, 0.986415, -0.132899, +0.000000, 1.000000, 0.000000, 0.050000, 0.000000, 0.096557, 0.986415, -0.132899, +0.095491, 0.951057, -0.293893, 0.100000, 0.100000, -0.000000, 0.986415, -0.164272, +-0.095492, 0.951057, -0.293893, 0.200000, 0.100000, -0.000000, 0.986415, -0.164272, +0.000000, 1.000000, 0.000000, 0.150000, 0.000000, -0.000000, 0.986415, -0.164272, +-0.095492, 0.951057, -0.293893, 0.200000, 0.100000, -0.096557, 0.986415, -0.132899, +-0.250000, 0.951057, -0.181636, 0.300000, 0.100000, -0.096557, 0.986415, -0.132899, +0.000000, 1.000000, 0.000000, 0.250000, 0.000000, -0.096557, 0.986415, -0.132899, +-0.250000, 0.951057, -0.181636, 0.300000, 0.100000, -0.156233, 0.986415, -0.050763, +-0.309017, 0.951057, 0.000000, 0.400000, 0.100000, -0.156233, 0.986415, -0.050763, +0.000000, 1.000000, 0.000000, 0.350000, 0.000000, -0.156233, 0.986415, -0.050763, +-0.309017, 0.951057, 0.000000, 0.400000, 0.100000, -0.156233, 0.986415, 0.050763, +-0.250000, 0.951057, 0.181636, 0.500000, 0.100000, -0.156233, 0.986415, 0.050763, +0.000000, 1.000000, 0.000000, 0.450000, 0.000000, -0.156233, 0.986415, 0.050763, +-0.250000, 0.951057, 0.181636, 0.500000, 0.100000, -0.096557, 0.986415, 0.132899, +-0.095491, 0.951057, 0.293893, 0.600000, 0.100000, -0.096557, 0.986415, 0.132899, +0.000000, 1.000000, 0.000000, 0.550000, 0.000000, -0.096557, 0.986415, 0.132899, +-0.095491, 0.951057, 0.293893, 0.600000, 0.100000, 0.000000, 0.986415, 0.164272, +0.095492, 0.951057, 0.293893, 0.700000, 0.100000, 0.000000, 0.986415, 0.164272, +0.000000, 1.000000, 0.000000, 0.650000, 0.000000, 0.000000, 0.986415, 0.164272, +0.095492, 0.951057, 0.293893, 0.700000, 0.100000, 0.096557, 0.986415, 0.132899, +0.250000, 0.951057, 0.181636, 0.800000, 0.100000, 0.096557, 0.986415, 0.132899, +0.000000, 1.000000, 0.000000, 0.750000, 0.000000, 0.096557, 0.986415, 0.132899, +0.250000, 0.951057, 0.181636, 0.800000, 0.100000, 0.156233, 0.986415, 0.050763, +0.309017, 0.951057, 0.000000, 0.900000, 0.100000, 0.156233, 0.986415, 0.050763, +0.000000, 1.000000, 0.000000, 0.850000, 0.000000, 0.156233, 0.986415, 0.050763, +0.309017, 0.951057, 0.000000, 0.900000, 0.100000, 0.156233, 0.986415, -0.050763, +0.250000, 0.951057, -0.181636, 1.000000, 0.100000, 0.156233, 0.986415, -0.050763, +0.000000, 1.000000, 0.000000, 0.950000, 0.000000, 0.156233, 0.986415, -0.050763, +}; diff --git a/tools/ArtistTools/source/CoreLib/Render/GeometryData/LightGeometryData.h b/tools/ArtistTools/source/CoreLib/Render/GeometryData/LightGeometryData.h new file mode 100644 index 0000000..ed21841 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/GeometryData/LightGeometryData.h @@ -0,0 +1,269 @@ +const int num_faces = 88; + +// pos.xyz, uv.uv, normal.xyz +float vertices[88*3*8] = { +2.977119, 2.977121, -34.306633, 0.375000, 0.687500, 0.177861, 0.429396, -0.885429, +0.000000, 4.210287, -34.306633, 0.406250, 0.687500, 0.177861, 0.429396, -0.885429, +0.000000, 9.084861, -31.942669, 0.406250, 0.640508, 0.177861, 0.429396, -0.885429, +0.000000, 4.210287, -34.306633, 0.406250, 0.687500, -0.177861, 0.429396, -0.885429, +-2.977119, 2.977121, -34.306633, 0.437500, 0.687500, -0.177861, 0.429396, -0.885429, +-6.423970, 6.423968, -31.942669, 0.437500, 0.640508, -0.177861, 0.429396, -0.885429, +-2.977119, 2.977121, -34.306633, 0.437500, 0.687500, -0.429395, 0.177862, -0.885430, +-4.210285, 0.000002, -34.306633, 0.468750, 0.687500, -0.429395, 0.177862, -0.885430, +-9.084864, -0.000001, -31.942669, 0.468750, 0.640508, -0.429395, 0.177862, -0.885429, +-4.210285, 0.000002, -34.306633, 0.468750, 0.687500, -0.429395, -0.177862, -0.885430, +-2.977119, -2.977118, -34.306633, 0.500000, 0.687500, -0.429395, -0.177862, -0.885430, +-6.423970, -6.423972, -31.942667, 0.500000, 0.640508, -0.429395, -0.177862, -0.885430, +-2.977119, -2.977118, -34.306633, 0.500000, 0.687500, -0.177861, -0.429395, -0.885429, +0.000000, -4.210283, -34.306633, 0.531250, 0.687500, -0.177861, -0.429395, -0.885429, +0.000000, -9.084865, -31.942671, 0.531250, 0.640508, -0.177861, -0.429395, -0.885429, +0.000000, -4.210283, -34.306633, 0.531250, 0.687500, 0.177862, -0.429395, -0.885429, +2.977120, -2.977118, -34.306633, 0.562500, 0.687500, 0.177862, -0.429395, -0.885429, +6.423971, -6.423972, -31.942667, 0.562500, 0.640508, 0.177862, -0.429395, -0.885429, +2.977120, -2.977118, -34.306633, 0.562500, 0.687500, 0.429395, -0.177862, -0.885430, +4.210286, 0.000002, -34.306633, 0.593750, 0.687500, 0.429395, -0.177862, -0.885430, +9.084865, -0.000001, -31.942669, 0.593750, 0.640508, 0.429395, -0.177862, -0.885429, +4.210286, 0.000002, -34.306633, 0.593750, 0.687500, 0.429395, 0.177862, -0.885429, +2.977119, 2.977121, -34.306633, 0.625000, 0.687500, 0.429395, 0.177862, -0.885429, +6.423971, 6.423968, -31.942669, 0.625000, 0.640508, 0.429395, 0.177862, -0.885429, +-4.210285, 0.000002, -34.306633, 0.343750, 0.843750, -0.124125, -0.051414, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, -0.124125, -0.051414, -0.990934, +-2.977119, -2.977118, -34.306633, 0.389515, 0.733265, -0.124125, -0.051414, -0.990934, +10.861003, 0.000000, -10.002398, 0.593750, 0.499530, 0.791070, 0.327672, -0.516564, +7.679888, 7.679888, -10.002398, 0.625000, 0.499530, 0.791071, 0.327672, -0.516564, +12.349342, 12.349340, 0.110407, 0.625000, 0.311560, 0.791070, 0.327672, -0.516564, +7.679889, -7.679889, -10.002397, 0.562500, 0.499530, 0.791071, -0.327672, -0.516564, +10.861003, 0.000000, -10.002398, 0.593750, 0.499530, 0.791070, -0.327672, -0.516564, +17.464600, 0.000000, 0.110407, 0.593750, 0.311560, 0.791070, -0.327672, -0.516564, +0.000000, -10.861002, -10.002398, 0.531250, 0.499530, 0.327672, -0.791071, -0.516564, +7.679889, -7.679889, -10.002397, 0.562500, 0.499530, 0.327672, -0.791071, -0.516564, +12.349343, -12.349342, 0.110407, 0.562500, 0.311560, 0.327672, -0.791071, -0.516564, +-7.679888, -7.679888, -10.002398, 0.500000, 0.499530, -0.327672, -0.791071, -0.516564, +0.000000, -10.861002, -10.002398, 0.531250, 0.499530, -0.327672, -0.791071, -0.516564, +0.000001, -17.464596, 0.110407, 0.531250, 0.311560, -0.327672, -0.791071, -0.516564, +-10.861002, 0.000000, -10.002398, 0.468750, 0.499530, -0.791071, -0.327672, -0.516564, +-7.679888, -7.679888, -10.002398, 0.500000, 0.499530, -0.791071, -0.327672, -0.516564, +-12.349340, -12.349340, 0.110407, 0.500000, 0.311560, -0.791071, -0.327672, -0.516564, +-7.679888, 7.679888, -10.002398, 0.437500, 0.499530, -0.791071, 0.327672, -0.516564, +-10.861002, 0.000000, -10.002398, 0.468750, 0.499530, -0.791071, 0.327672, -0.516564, +-17.464596, 0.000000, 0.110407, 0.468750, 0.311560, -0.791071, 0.327672, -0.516564, +0.000000, 10.861002, -10.002398, 0.406250, 0.499530, -0.327672, 0.791071, -0.516564, +-7.679888, 7.679888, -10.002398, 0.437500, 0.499530, -0.327672, 0.791071, -0.516564, +-12.349340, 12.349340, 0.110407, 0.437500, 0.311560, -0.327672, 0.791071, -0.516564, +7.679888, 7.679888, -10.002398, 0.375000, 0.499530, 0.327672, 0.791071, -0.516564, +0.000000, 10.861002, -10.002398, 0.406250, 0.499530, 0.327672, 0.791071, -0.516564, +0.000001, 17.464598, 0.110407, 0.406250, 0.311560, 0.327672, 0.791071, -0.516564, +10.861003, -0.000001, -29.138687, 0.593750, 0.593515, 0.923880, 0.382683, 0.000000, +7.679888, 7.679889, -29.138687, 0.625000, 0.593515, 0.923880, 0.382683, 0.000000, +7.679888, 7.679888, -10.002398, 0.625000, 0.499530, 0.923880, 0.382683, 0.000000, +7.679889, -7.679891, -29.138687, 0.562500, 0.593515, 0.923880, -0.382683, 0.000000, +10.861003, -0.000001, -29.138687, 0.593750, 0.593515, 0.923880, -0.382683, 0.000000, +10.861003, 0.000000, -10.002398, 0.593750, 0.499530, 0.923880, -0.382683, 0.000000, +0.000000, -10.861003, -29.138685, 0.531250, 0.593515, 0.382683, -0.923880, 0.000000, +7.679889, -7.679891, -29.138687, 0.562500, 0.593515, 0.382683, -0.923880, 0.000000, +7.679889, -7.679889, -10.002397, 0.562500, 0.499530, 0.382683, -0.923880, 0.000000, +-7.679888, -7.679889, -29.138689, 0.500000, 0.593515, -0.382683, -0.923880, 0.000000, +0.000000, -10.861003, -29.138685, 0.531250, 0.593515, -0.382683, -0.923880, 0.000000, +0.000000, -10.861002, -10.002398, 0.531250, 0.499530, -0.382683, -0.923880, 0.000000, +-10.861002, -0.000001, -29.138687, 0.468750, 0.593515, -0.923880, -0.382683, 0.000000, +-7.679888, -7.679889, -29.138689, 0.500000, 0.593515, -0.923880, -0.382683, 0.000000, +-7.679888, -7.679888, -10.002398, 0.500000, 0.499530, -0.923880, -0.382683, 0.000000, +-7.679888, 7.679889, -29.138687, 0.437500, 0.593515, -0.923880, 0.382683, 0.000000, +-10.861002, -0.000001, -29.138687, 0.468750, 0.593515, -0.923880, 0.382683, 0.000000, +-10.861002, 0.000000, -10.002398, 0.468750, 0.499530, -0.923880, 0.382683, 0.000000, +0.000000, 10.860999, -29.138687, 0.406250, 0.593515, -0.382683, 0.923880, -0.000000, +-7.679888, 7.679889, -29.138687, 0.437500, 0.593515, -0.382683, 0.923880, -0.000000, +-7.679888, 7.679888, -10.002398, 0.437500, 0.499530, -0.382683, 0.923880, -0.000000, +7.679888, 7.679889, -29.138687, 0.375000, 0.593515, 0.382683, 0.923880, -0.000000, +0.000000, 10.860999, -29.138687, 0.406250, 0.593515, 0.382683, 0.923880, -0.000000, +0.000000, 10.861002, -10.002398, 0.406250, 0.499530, 0.382683, 0.923880, -0.000000, +9.084865, -0.000001, -31.942669, 0.593750, 0.640508, 0.797373, 0.330283, -0.505083, +6.423971, 6.423968, -31.942669, 0.625000, 0.640508, 0.797373, 0.330283, -0.505083, +7.679888, 7.679889, -29.138687, 0.625000, 0.593515, 0.797373, 0.330283, -0.505083, +6.423971, -6.423972, -31.942667, 0.562500, 0.640508, 0.797373, -0.330283, -0.505083, +9.084865, -0.000001, -31.942669, 0.593750, 0.640508, 0.797373, -0.330283, -0.505083, +10.861003, -0.000001, -29.138687, 0.593750, 0.593515, 0.797373, -0.330283, -0.505083, +0.000000, -9.084865, -31.942671, 0.531250, 0.640508, 0.330283, -0.797373, -0.505083, +6.423971, -6.423972, -31.942667, 0.562500, 0.640508, 0.330283, -0.797373, -0.505083, +7.679889, -7.679891, -29.138687, 0.562500, 0.593515, 0.330283, -0.797373, -0.505083, +-6.423970, -6.423972, -31.942667, 0.500000, 0.640508, -0.330283, -0.797373, -0.505083, +0.000000, -9.084865, -31.942671, 0.531250, 0.640508, -0.330283, -0.797373, -0.505083, +0.000000, -10.861003, -29.138685, 0.531250, 0.593515, -0.330283, -0.797373, -0.505083, +-9.084864, -0.000001, -31.942669, 0.468750, 0.640508, -0.797373, -0.330283, -0.505083, +-6.423970, -6.423972, -31.942667, 0.500000, 0.640508, -0.797374, -0.330282, -0.505083, +-7.679888, -7.679889, -29.138689, 0.500000, 0.593515, -0.797374, -0.330282, -0.505083, +-6.423970, 6.423968, -31.942669, 0.437500, 0.640508, -0.797373, 0.330283, -0.505083, +-9.084864, -0.000001, -31.942669, 0.468750, 0.640508, -0.797373, 0.330283, -0.505083, +-10.861002, -0.000001, -29.138687, 0.468750, 0.593515, -0.797373, 0.330283, -0.505083, +0.000000, 9.084861, -31.942669, 0.406250, 0.640508, -0.330282, 0.797373, -0.505084, +-6.423970, 6.423968, -31.942669, 0.437500, 0.640508, -0.330282, 0.797373, -0.505084, +-7.679888, 7.679889, -29.138687, 0.437500, 0.593515, -0.330282, 0.797373, -0.505084, +6.423971, 6.423968, -31.942669, 0.375000, 0.640508, 0.330282, 0.797373, -0.505084, +0.000000, 9.084861, -31.942669, 0.406250, 0.640508, 0.330282, 0.797373, -0.505084, +0.000000, 10.860999, -29.138687, 0.406250, 0.593515, 0.330282, 0.797373, -0.505084, +2.977119, 2.977121, -34.306633, 0.610485, 0.954235, 0.124125, 0.051414, -0.990934, +4.210286, 0.000002, -34.306633, 0.656250, 0.843750, 0.124125, 0.051414, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, 0.124125, 0.051414, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, 0.124125, -0.051414, -0.990934, +4.210286, 0.000002, -34.306633, 0.656250, 0.843750, 0.124125, -0.051414, -0.990934, +2.977120, -2.977118, -34.306633, 0.610485, 0.733265, 0.124125, -0.051414, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, 0.051415, -0.124125, -0.990934, +2.977120, -2.977118, -34.306633, 0.610485, 0.733265, 0.051415, -0.124125, -0.990934, +0.000000, -4.210283, -34.306633, 0.500000, 0.687500, 0.051415, -0.124125, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, -0.051414, -0.124125, -0.990934, +0.000000, -4.210283, -34.306633, 0.500000, 0.687500, -0.051414, -0.124125, -0.990934, +-2.977119, -2.977118, -34.306633, 0.389515, 0.733265, -0.051414, -0.124125, -0.990934, +-2.977119, 2.977121, -34.306633, 0.389515, 0.954235, -0.124125, 0.051414, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, -0.124125, 0.051414, -0.990934, +-4.210285, 0.000002, -34.306633, 0.343750, 0.843750, -0.124125, 0.051414, -0.990934, +0.000000, 4.210287, -34.306633, 0.500000, 1.000000, -0.051414, 0.124125, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, -0.051414, 0.124125, -0.990934, +-2.977119, 2.977121, -34.306633, 0.389515, 0.954235, -0.051414, 0.124125, -0.990934, +2.977119, 2.977121, -34.306633, 0.610485, 0.954235, 0.051414, 0.124125, -0.990934, +0.000000, 0.000002, -34.834015, 0.500000, 0.843750, 0.051414, 0.124125, -0.990934, +0.000000, 4.210287, -34.306633, 0.500000, 1.000000, 0.051414, 0.124125, -0.990934, +12.349342, 12.349340, 0.110407, 0.610485, 0.045765, 0.382683, 0.923880, 0.000000, +0.000001, 17.464598, 0.110407, 0.500000, 0.000000, 0.382683, 0.923880, 0.000000, +0.000001, 17.464598, 1.144262, 0.500000, 0.000000, 0.382683, 0.923880, 0.000000, +0.000001, 17.464598, 0.110407, 0.500000, 0.000000, -0.382683, 0.923880, -0.000000, +-12.349340, 12.349340, 0.110407, 0.389515, 0.045765, -0.382683, 0.923880, -0.000000, +-12.349340, 12.349340, 1.144262, 0.389515, 0.045765, -0.382683, 0.923880, -0.000000, +-12.349340, 12.349340, 0.110407, 0.389515, 0.045765, -0.923880, 0.382683, 0.000000, +-17.464596, 0.000000, 0.110407, 0.343750, 0.156250, -0.923880, 0.382683, 0.000000, +-17.464596, 0.000000, 1.144262, 0.343750, 0.156250, -0.923880, 0.382683, 0.000000, +-17.464596, 0.000000, 0.110407, 0.343750, 0.156250, -0.923880, -0.382683, 0.000000, +-12.349340, -12.349340, 0.110407, 0.389515, 0.266735, -0.923880, -0.382683, 0.000000, +-12.349340, -12.349340, 1.144262, 0.389515, 0.266735, -0.923880, -0.382683, 0.000000, +-12.349340, -12.349340, 0.110407, 0.389515, 0.266735, -0.382683, -0.923880, -0.000002, +0.000001, -17.464596, 0.110407, 0.500000, 0.312500, -0.382683, -0.923880, -0.000002, +0.000001, -17.464600, 1.144262, 0.500000, 0.312500, -0.382683, -0.923880, -0.000002, +0.000001, -17.464596, 0.110407, 0.500000, 0.312500, 0.382683, -0.923880, -0.000002, +12.349343, -12.349342, 0.110407, 0.610485, 0.266735, 0.382683, -0.923880, -0.000002, +12.349343, -12.349342, 1.144262, 0.610485, 0.266735, 0.382683, -0.923880, -0.000002, +12.349343, -12.349342, 0.110407, 0.610485, 0.266735, 0.923880, -0.382683, 0.000000, +17.464600, 0.000000, 0.110407, 0.656250, 0.156250, 0.923880, -0.382683, 0.000000, +17.464600, 0.000000, 1.144262, 0.656250, 0.156250, 0.923880, -0.382683, 0.000000, +17.464600, 0.000000, 0.110407, 0.656250, 0.156250, 0.923880, 0.382683, 0.000000, +12.349342, 12.349340, 0.110407, 0.610485, 0.045765, 0.923880, 0.382683, 0.000000, +12.349342, 12.349340, 1.144262, 0.610485, 0.045765, 0.923880, 0.382683, 0.000000, +12.349342, 12.349340, 1.144262, 0.610485, 0.045765, -0.117337, -0.283277, 0.951833, +0.000001, 17.464598, 1.144262, 0.500000, 0.000000, -0.117337, -0.283277, 0.951833, +0.000001, 15.735191, 0.629568, 0.500000, 0.000000, -0.117337, -0.283277, 0.951833, +0.000001, 17.464598, 1.144262, 0.500000, 0.000000, 0.117337, -0.283277, 0.951833, +-12.349340, 12.349340, 1.144262, 0.389515, 0.045765, 0.117337, -0.283277, 0.951833, +-11.126453, 11.126453, 0.629568, 0.389515, 0.045765, 0.117337, -0.283277, 0.951833, +-12.349340, 12.349340, 1.144262, 0.389515, 0.045765, 0.283277, -0.117337, 0.951833, +-17.464596, 0.000000, 1.144262, 0.343750, 0.156250, 0.283277, -0.117337, 0.951833, +-15.735189, 0.000000, 0.629568, 0.343750, 0.156250, 0.283277, -0.117337, 0.951833, +-17.464596, 0.000000, 1.144262, 0.343750, 0.156250, 0.283277, 0.117337, 0.951833, +-12.349340, -12.349340, 1.144262, 0.389515, 0.266735, 0.283277, 0.117337, 0.951833, +-11.126453, -11.126453, 0.629568, 0.389515, 0.266735, 0.283277, 0.117337, 0.951833, +-12.349340, -12.349340, 1.144262, 0.389515, 0.266735, 0.117337, 0.283277, 0.951833, +0.000001, -17.464600, 1.144262, 0.500000, 0.312500, 0.117337, 0.283277, 0.951833, +0.000001, -15.735191, 0.629568, 0.500000, 0.312500, 0.117337, 0.283277, 0.951833, +0.000001, -17.464600, 1.144262, 0.500000, 0.312500, -0.117337, 0.283277, 0.951833, +12.349343, -12.349342, 1.144262, 0.610485, 0.266735, -0.117337, 0.283277, 0.951833, +11.126457, -11.126455, 0.629568, 0.610485, 0.266735, -0.117337, 0.283277, 0.951833, +12.349343, -12.349342, 1.144262, 0.610485, 0.266735, -0.283277, 0.117337, 0.951833, +17.464600, 0.000000, 1.144262, 0.656250, 0.156250, -0.283277, 0.117337, 0.951833, +15.735193, 0.000000, 0.629568, 0.656250, 0.156250, -0.283277, 0.117337, 0.951833, +17.464600, 0.000000, 1.144262, 0.656250, 0.156250, -0.283277, -0.117337, 0.951833, +12.349342, 12.349340, 1.144262, 0.610485, 0.045765, -0.283277, -0.117337, 0.951833, +11.126455, 11.126453, 0.629568, 0.610485, 0.045765, -0.283277, -0.117337, 0.951833, +15.735193, 0.000000, 0.629568, 0.656250, 0.156250, -0.301379, -0.124836, 0.945297, +11.126455, 11.126453, 0.629568, 0.610485, 0.045765, -0.301379, -0.124836, 0.945297, +1.172339, 1.172337, -3.858527, 0.610485, 0.045765, -0.301379, -0.124836, 0.945297, +11.126455, 11.126453, 0.629568, 0.610485, 0.045765, -0.124835, -0.301379, 0.945297, +0.000001, 15.735191, 0.629568, 0.500000, 0.000000, -0.124835, -0.301379, 0.945297, +0.000001, 1.657940, -3.858527, 0.500000, 0.000000, -0.124835, -0.301379, 0.945297, +0.000001, 15.735191, 0.629568, 0.500000, 0.000000, 0.124835, -0.301379, 0.945297, +-11.126453, 11.126453, 0.629568, 0.389515, 0.045765, 0.124835, -0.301379, 0.945297, +-1.172335, 1.172337, -3.858527, 0.389515, 0.045765, 0.124835, -0.301379, 0.945297, +-11.126453, 11.126453, 0.629568, 0.389515, 0.045765, 0.301379, -0.124835, 0.945297, +-15.735189, 0.000000, 0.629568, 0.343750, 0.156250, 0.301379, -0.124835, 0.945297, +-1.657938, 0.000000, -3.858527, 0.343750, 0.156250, 0.301379, -0.124835, 0.945297, +-15.735189, 0.000000, 0.629568, 0.343750, 0.156250, 0.301379, 0.124835, 0.945297, +-11.126453, -11.126453, 0.629568, 0.389515, 0.266735, 0.301379, 0.124835, 0.945297, +-1.172335, -1.172337, -3.858527, 0.389515, 0.266735, 0.301379, 0.124835, 0.945297, +-11.126453, -11.126453, 0.629568, 0.389515, 0.266735, 0.124836, 0.301379, 0.945297, +0.000001, -15.735191, 0.629568, 0.500000, 0.312500, 0.124835, 0.301379, 0.945297, +0.000001, -1.657940, -3.858527, 0.500000, 0.312500, 0.124836, 0.301379, 0.945297, +0.000001, -15.735191, 0.629568, 0.500000, 0.312500, -0.124835, 0.301379, 0.945297, +11.126457, -11.126455, 0.629568, 0.610485, 0.266735, -0.124835, 0.301379, 0.945297, +1.172339, -1.172337, -3.858527, 0.610485, 0.266735, -0.124835, 0.301379, 0.945297, +11.126457, -11.126455, 0.629568, 0.610485, 0.266735, -0.301379, 0.124835, 0.945297, +15.735193, 0.000000, 0.629568, 0.656250, 0.156250, -0.301379, 0.124835, 0.945297, +1.657941, 0.000000, -3.858527, 0.656250, 0.156250, -0.301379, 0.124835, 0.945297, +1.657941, 0.000000, -3.858527, 0.656250, 0.156250, 0.923878, 0.382687, 0.000000, +1.172339, 1.172337, -3.858527, 0.610485, 0.045765, 0.923878, 0.382687, 0.000000, +1.172338, 1.172337, 18.507620, 0.610485, 0.045765, 0.890349, 0.368798, -0.266959, +1.172339, 1.172337, -3.858527, 0.610485, 0.045765, 0.382687, 0.923878, 0.000000, +0.000001, 1.657940, -3.858527, 0.500000, 0.000000, 0.382687, 0.923878, 0.000000, +0.000001, 1.657940, 18.507620, 0.500000, 0.000000, 0.368799, 0.890348, -0.266960, +0.000001, 1.657940, -3.858527, 0.500000, 0.000000, -0.382687, 0.923878, -0.000000, +-1.172335, 1.172337, -3.858527, 0.389515, 0.045765, -0.382687, 0.923878, -0.000000, +-1.172336, 1.172337, 18.507620, 0.389515, 0.045765, -0.368799, 0.890348, -0.266959, +-1.172335, 1.172337, -3.858527, 0.389515, 0.045765, -0.923878, 0.382687, -0.000000, +-1.657938, 0.000000, -3.858527, 0.343750, 0.156250, -0.923878, 0.382687, -0.000000, +-1.657939, 0.000000, 18.507620, 0.343750, 0.156250, -0.890348, 0.368798, -0.266960, +-1.657938, 0.000000, -3.858527, 0.343750, 0.156250, -0.923878, -0.382687, -0.000000, +-1.172335, -1.172337, -3.858527, 0.389515, 0.266735, -0.923878, -0.382687, -0.000000, +-1.172336, -1.172337, 18.507620, 0.389515, 0.266735, -0.890348, -0.368798, -0.266959, +-1.172335, -1.172337, -3.858527, 0.389515, 0.266735, -0.382687, -0.923878, -0.000000, +0.000001, -1.657940, -3.858527, 0.500000, 0.312500, -0.382687, -0.923878, -0.000000, +0.000001, -1.657940, 18.507620, 0.500000, 0.312500, -0.368799, -0.890348, -0.266960, +0.000001, -1.657940, -3.858527, 0.500000, 0.312500, 0.382687, -0.923878, 0.000000, +1.172339, -1.172337, -3.858527, 0.610485, 0.266735, 0.382687, -0.923878, 0.000000, +1.172338, -1.172337, 18.507620, 0.610485, 0.266735, 0.368799, -0.890348, -0.266959, +1.172339, -1.172337, -3.858527, 0.610485, 0.266735, 0.923878, -0.382687, 0.000000, +1.657941, 0.000000, -3.858527, 0.656250, 0.156250, 0.923878, -0.382687, 0.000000, +1.657941, 0.000000, 18.507620, 0.656250, 0.156250, 0.890348, -0.368798, -0.266960, +1.657941, 0.000000, 18.507620, 0.656250, 0.156250, 0.890348, 0.368798, -0.266960, +1.172338, 1.172337, 18.507620, 0.610485, 0.045765, 0.890349, 0.368798, -0.266959, +3.204545, 3.204544, 18.507618, 0.610485, 0.045765, 0.916255, 0.379530, 0.128197, +1.172338, -1.172337, 18.507620, 0.610485, 0.266735, 0.890349, -0.368798, -0.266959, +1.657941, 0.000000, 18.507620, 0.656250, 0.156250, 0.890348, -0.368798, -0.266960, +4.531928, 0.000000, 18.507618, 0.656250, 0.156250, 0.916255, -0.379530, 0.128199, +0.000001, -1.657940, 18.507620, 0.500000, 0.312500, 0.368799, -0.890348, -0.266960, +1.172338, -1.172337, 18.507620, 0.610485, 0.266735, 0.368799, -0.890348, -0.266959, +3.204545, -3.204544, 18.507618, 0.610485, 0.266735, 0.379530, -0.916255, 0.128197, +-1.172336, -1.172337, 18.507620, 0.389515, 0.266735, -0.368799, -0.890348, -0.266959, +0.000001, -1.657940, 18.507620, 0.500000, 0.312500, -0.368799, -0.890348, -0.266960, +0.000000, -4.531925, 18.507618, 0.500000, 0.312500, -0.379530, -0.916255, 0.128199, +-1.657939, 0.000000, 18.507620, 0.343750, 0.156250, -0.890348, -0.368798, -0.266960, +-1.172336, -1.172337, 18.507620, 0.389515, 0.266735, -0.890348, -0.368798, -0.266959, +-3.204544, -3.204544, 18.507618, 0.389515, 0.266735, -0.916255, -0.379530, 0.128197, +-1.172336, 1.172337, 18.507620, 0.389515, 0.045765, -0.890348, 0.368798, -0.266959, +-1.657939, 0.000000, 18.507620, 0.343750, 0.156250, -0.890348, 0.368798, -0.266960, +-4.531927, 0.000000, 18.507618, 0.343750, 0.156250, -0.916254, 0.379530, 0.128199, +0.000001, 1.657940, 18.507620, 0.500000, 0.000000, -0.368799, 0.890348, -0.266960, +-1.172336, 1.172337, 18.507620, 0.389515, 0.045765, -0.368799, 0.890348, -0.266959, +-3.204544, 3.204544, 18.507618, 0.389515, 0.045765, -0.379530, 0.916255, 0.128197, +1.172338, 1.172337, 18.507620, 0.610485, 0.045765, 0.368799, 0.890348, -0.266959, +0.000001, 1.657940, 18.507620, 0.500000, 0.000000, 0.368799, 0.890348, -0.266960, +0.000000, 4.531925, 18.507618, 0.500000, 0.000000, 0.379530, 0.916255, 0.128199, +3.204545, -3.204544, 18.507618, 0.610485, 0.266735, 0.916255, -0.379530, 0.128197, +4.531928, 0.000000, 18.507618, 0.656250, 0.156250, 0.916255, -0.379530, 0.128199, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, 0.831594, -0.344462, 0.435657, +0.000000, -4.531925, 18.507618, 0.500000, 0.312500, 0.379530, -0.916255, 0.128199, +3.204545, -3.204544, 18.507618, 0.610485, 0.266735, 0.379530, -0.916255, 0.128197, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, 0.344462, -0.831594, 0.435657, +-3.204544, -3.204544, 18.507618, 0.389515, 0.266735, -0.379530, -0.916255, 0.128197, +0.000000, -4.531925, 18.507618, 0.500000, 0.312500, -0.379530, -0.916255, 0.128199, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, -0.344462, -0.831594, 0.435657, +-4.531927, 0.000000, 18.507618, 0.343750, 0.156250, -0.916254, -0.379530, 0.128199, +-3.204544, -3.204544, 18.507618, 0.389515, 0.266735, -0.916255, -0.379530, 0.128197, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, -0.831594, -0.344462, 0.435657, +-3.204544, 3.204544, 18.507618, 0.389515, 0.045765, -0.916255, 0.379530, 0.128197, +-4.531927, 0.000000, 18.507618, 0.343750, 0.156250, -0.916254, 0.379530, 0.128199, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, -0.831594, 0.344462, 0.435657, +0.000000, 4.531925, 18.507618, 0.500000, 0.000000, -0.379530, 0.916255, 0.128199, +-3.204544, 3.204544, 18.507618, 0.389515, 0.045765, -0.379530, 0.916255, 0.128197, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, -0.344462, 0.831594, 0.435657, +3.204545, 3.204544, 18.507618, 0.610485, 0.045765, 0.379530, 0.916255, 0.128197, +0.000000, 4.531925, 18.507618, 0.500000, 0.000000, 0.379530, 0.916255, 0.128199, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, 0.344462, 0.831594, 0.435657, +4.531928, 0.000000, 18.507618, 0.656250, 0.156250, 0.916255, 0.379530, 0.128199, +3.204545, 3.204544, 18.507618, 0.610485, 0.045765, 0.916255, 0.379530, 0.128197, +0.000000, 0.000000, 27.158279, 0.500000, 0.156250, 0.831594, 0.344462, 0.435657, +}; diff --git a/tools/ArtistTools/source/CoreLib/Render/GeometryData/WindGeometryData.h b/tools/ArtistTools/source/CoreLib/Render/GeometryData/WindGeometryData.h new file mode 100644 index 0000000..3d1390a --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/GeometryData/WindGeometryData.h @@ -0,0 +1,2513 @@ +const int num_faces = 836; + +// pos.xyz, uv.uv, normal.xyz +float vertices[836*3*8] = { +-1.002737, 3.502487, -29.476650, 1.000000, 0.966243, -0.570521, -0.819696, 0.051023, +-1.002737, 3.589727, -28.074986, 1.000000, 0.922656, -0.569426, -0.818637, 0.074745, +-1.336982, 4.293425, -28.133030, 0.500000, 0.922656, -0.999926, -0.012083, 0.001603, +-1.336982, 4.293425, -28.133030, 0.500000, 0.922656, -0.999926, -0.012083, 0.001603, +-1.002737, 4.997122, -28.191074, 0.000000, 0.932486, -0.582174, 0.810005, -0.070467, +-1.002737, 4.921762, -29.530731, 0.000000, 0.966243, -0.582241, 0.811733, -0.045666, +-1.002737, 5.199909, -26.333269, 0.000000, 0.859409, -0.582690, 0.803052, -0.124820, +-1.002737, 4.997122, -28.191074, 0.000000, 0.932486, -0.582174, 0.810005, -0.070467, +-1.336982, 4.293425, -28.133030, 0.500000, 0.922656, -0.999926, -0.012083, 0.001603, +-1.336982, 4.293425, -28.133030, 0.500000, 0.922656, -0.999926, -0.012083, 0.001603, +-1.002737, 3.589727, -28.074986, 1.000000, 0.922656, -0.569426, -0.818637, 0.074745, +-1.002737, 3.807196, -26.139326, 1.000000, 0.859409, -0.566467, -0.814177, 0.127399, +-1.002737, 3.807196, -26.139326, 1.000000, 0.859409, -0.566467, -0.814177, 0.127399, +-1.002737, 4.261988, -23.779169, 1.000000, 0.775297, -0.564634, -0.800896, 0.199384, +-1.336982, 4.951294, -23.914915, 0.500000, 0.775297, -0.999837, -0.017439, 0.004781, +-1.336982, 4.951294, -23.914915, 0.500000, 0.775297, -0.999837, -0.017439, 0.004781, +-1.002737, 5.640600, -24.050657, 0.000000, 0.786333, -0.583127, 0.787897, -0.197941, +-1.002737, 5.199909, -26.333269, 0.000000, 0.859409, -0.582690, 0.803052, -0.124820, +-1.002737, 6.429670, -21.436577, 0.000000, 0.669113, -0.579786, 0.770207, -0.265761, +-1.002737, 5.640600, -24.050657, 0.000000, 0.786333, -0.583127, 0.787897, -0.197941, +-1.336982, 4.951294, -23.914915, 0.500000, 0.775297, -0.999837, -0.017439, 0.004781, +-1.336982, 4.951294, -23.914915, 0.500000, 0.775297, -0.999837, -0.017439, 0.004781, +-1.002737, 4.261988, -23.779169, 1.000000, 0.775297, -0.564634, -0.800896, 0.199384, +-1.002737, 5.061195, -21.104027, 1.000000, 0.669113, -0.566458, -0.779905, 0.266220, +-1.002737, 5.061195, -21.104027, 1.000000, 0.669113, -0.566458, -0.779905, 0.266220, +-1.002737, 6.120935, -18.335461, 1.000000, 0.547971, -0.566613, -0.758528, 0.321845, +-1.336982, 6.802818, -18.519814, 0.500000, 0.547971, -0.999946, -0.009100, 0.005070, +-1.336982, 6.802818, -18.519814, 0.500000, 0.547971, -0.999946, -0.009100, 0.005070, +-1.002737, 7.484703, -18.704168, 0.000000, 0.551894, -0.576888, 0.751118, -0.320970, +-1.002737, 6.429670, -21.436577, 0.000000, 0.669113, -0.579786, 0.770207, -0.265761, +-1.002737, 8.723274, -16.066572, 0.000000, 0.418984, -0.570577, 0.739144, -0.357922, +-1.002737, 7.484703, -18.704168, 0.000000, 0.551894, -0.576888, 0.751118, -0.320970, +-1.336982, 6.802818, -18.519814, 0.500000, 0.547971, -0.999946, -0.009100, 0.005070, +-1.336982, 6.802818, -18.519814, 0.500000, 0.547971, -0.999946, -0.009100, 0.005070, +-1.002737, 6.120935, -18.335461, 1.000000, 0.547971, -0.566613, -0.758528, 0.321845, +-1.002737, 7.357327, -15.695049, 1.000000, 0.418984, -0.568348, -0.740553, 0.358555, +-1.002737, 7.357327, -15.695049, 1.000000, 0.418984, -0.568348, -0.740553, 0.358555, +-1.002737, 8.627859, -13.158705, 1.000000, 0.282904, -0.571429, -0.737705, 0.359528, +-1.336982, 9.314625, -13.332255, 0.500000, 0.282904, -0.999983, 0.005125, -0.002905, +-1.336982, 9.314625, -13.332255, 0.500000, 0.282904, -0.999983, 0.005125, -0.002905, +-1.002737, 10.001389, -13.505806, 0.000000, 0.286075, -0.565597, 0.742253, -0.359389, +-1.002737, 8.723274, -16.066572, 0.000000, 0.418984, -0.570577, 0.739144, -0.357922, +-1.002737, 11.175043, -11.003893, 0.000000, 0.140482, -0.562513, 0.757929, -0.330337, +-1.002737, 10.001389, -13.505806, 0.000000, 0.286075, -0.565597, 0.742253, -0.359389, +-1.336982, 9.314625, -13.332255, 0.500000, 0.282904, -0.999983, 0.005125, -0.002905, +-1.336982, 9.314625, -13.332255, 0.500000, 0.282904, -0.999983, 0.005125, -0.002905, +-1.002737, 8.627859, -13.158705, 1.000000, 0.282904, -0.571429, -0.737705, 0.359528, +-1.002737, 9.790028, -10.702334, 1.000000, 0.140482, -0.576949, -0.747604, 0.328966, +-1.002737, 9.790028, -10.702334, 1.000000, 0.140482, -0.576949, -0.747604, 0.328966, +-1.003346, 10.657795, -8.543959, 1.020833, -0.009381, -0.588551, -0.767718, 0.253411, +-1.337592, 11.355911, -8.670841, 0.583333, -0.069211, -0.999594, 0.026023, -0.011609, +-1.337592, 11.355911, -8.670841, 0.583333, -0.069211, -0.999594, 0.026023, -0.011609, +-1.003346, 12.054029, -8.797724, 0.000000, -0.005111, -0.560047, 0.787144, -0.258362, +-1.002737, 11.175043, -11.003893, 0.000000, 0.140482, -0.562513, 0.757929, -0.330337, +-1.005175, 12.448139, -7.124194, 0.666667, -0.726194, -0.564732, 0.815815, -0.124590, +-1.003346, 12.054029, -8.797724, 0.000000, -0.005111, -0.560047, 0.787144, -0.258362, +-1.337592, 11.355911, -8.670841, 0.583333, -0.069211, -0.999594, 0.026023, -0.011609, +-1.337592, 11.355911, -8.670841, 0.583333, -0.069211, -0.999594, 0.026023, -0.011609, +-1.003346, 10.657795, -8.543959, 1.020833, -0.009381, -0.588551, -0.767718, 0.253411, +-1.005175, 11.045135, -6.901599, 1.083333, -0.167786, -0.591577, -0.797310, 0.119726, +-1.005175, 11.045135, -6.901599, 1.083333, -0.167786, -0.591577, -0.797310, 0.119726, +-1.006394, 11.114811, -5.517140, 1.000000, -0.170915, -0.583093, -0.812392, -0.004755, +-1.340640, 11.818584, -5.617008, 1.166667, -0.809096, -0.999853, 0.017074, 0.001872, +-1.340640, 11.818584, -5.617008, 1.166667, -0.809096, -0.999853, 0.017074, 0.001872, +-1.006394, 12.522362, -5.716876, 1.333333, -1.447277, -0.566040, 0.824377, 0.001632, +-1.005175, 12.448139, -7.124194, 0.666667, -0.726194, -0.564732, 0.815815, -0.124590, +-1.002737, 11.560024, -0.158328, 0.000000, -0.503387, -0.548128, 0.812439, 0.198744, +-1.003346, 12.142200, -2.567771, 0.000000, -0.336720, -0.545383, 0.819886, 0.174196, +-1.337592, 11.435898, -2.488622, 0.500000, -0.336720, -0.999671, 0.024155, 0.008634, +-1.337592, 11.435898, -2.488622, 0.500000, -0.336720, -0.999671, 0.024155, 0.008634, +-1.003346, 10.729588, -2.409474, 1.000000, -0.336720, -0.568927, -0.804482, -0.170679, +-1.002737, 10.154959, -0.010050, 1.000000, -0.503387, -0.554465, -0.809442, -0.193318, +-1.002737, 10.154959, -0.010050, 1.000000, -0.503387, -0.554465, -0.809442, -0.193318, +-1.002737, 9.503082, 2.725576, 1.000000, -0.671927, -0.543427, -0.820485, -0.177458, +-1.336982, 10.194935, 2.646095, 0.500000, -0.671927, -0.999975, -0.006839, -0.001674, +-1.336982, 10.194935, 2.646095, 0.500000, -0.671927, -0.999975, -0.006839, -0.001674, +-1.002737, 10.886791, 2.566613, 0.000000, -0.670054, -0.549613, 0.814083, 0.187601, +-1.002737, 11.560024, -0.158328, 0.000000, -0.503387, -0.548128, 0.812439, 0.198744, +-1.002737, 10.314148, 5.254678, 0.000000, -0.844213, -0.550065, 0.824042, 0.135588, +-1.002737, 10.886791, 2.566613, 0.000000, -0.670054, -0.549613, 0.814083, 0.187601, +-1.336982, 10.194935, 2.646095, 0.500000, -0.671927, -0.999975, -0.006839, -0.001674, +-1.336982, 10.194935, 2.646095, 0.500000, -0.671927, -0.999975, -0.006839, -0.001674, +-1.002737, 9.503082, 2.725576, 1.000000, -0.671927, -0.543427, -0.820485, -0.177458, +-1.002737, 8.971350, 5.457178, 1.000000, -0.844213, -0.532911, -0.837943, -0.117722, +-1.002737, 8.971350, 5.457178, 1.000000, -0.844213, -0.532911, -0.837943, -0.117722, +-1.002737, 8.743584, 8.108688, 1.000000, -1.016250, -0.522039, -0.852900, 0.006099, +-1.336982, 9.384014, 7.968127, 0.500000, -1.016250, -0.999385, -0.034959, -0.002597, +-1.336982, 9.384014, 7.968127, 0.500000, -1.016250, -0.999385, -0.034959, -0.002597, +-1.002737, 10.024443, 7.827566, 0.000000, -1.018373, -0.552727, 0.833125, 0.019881, +-1.002737, 10.314148, 5.254678, 0.000000, -0.844213, -0.550065, 0.824042, 0.135588, +-1.002737, 10.200031, 10.206976, 0.000000, -1.184038, -0.545898, 0.826469, -0.137636, +-1.002737, 10.024443, 7.827566, 0.000000, -1.018373, -0.552727, 0.833125, 0.019881, +-1.336982, 9.384014, 7.968127, 0.500000, -1.016250, -0.999385, -0.034959, -0.002597, +-1.336982, 9.384014, 7.968127, 0.500000, -1.016250, -0.999385, -0.034959, -0.002597, +-1.002737, 8.743584, 8.108688, 1.000000, -1.016250, -0.522039, -0.852900, 0.006099, +-1.002737, 9.003599, 10.604042, 1.000000, -1.184038, -0.512969, -0.841946, 0.167304, +-1.002737, 9.003599, 10.604042, 1.000000, -1.184038, -0.512969, -0.841946, 0.167304, +-1.002737, 9.694744, 12.910284, 1.000000, -1.349954, -0.500990, -0.803388, 0.321833, +-1.336982, 10.239292, 12.641662, 0.500000, -1.349954, -0.999218, -0.036495, 0.015192, +-1.336982, 10.239292, 12.641662, 0.500000, -1.349954, -0.999218, -0.036495, 0.015192, +-1.002737, 10.783842, 12.373039, 0.000000, -1.349704, -0.535040, 0.792292, -0.293266, +-1.002737, 10.200031, 10.206976, 0.000000, -1.184038, -0.545898, 0.826469, -0.137636, +-1.002737, 11.718807, 14.305887, 0.000000, -1.516370, -0.524951, 0.731928, -0.434405, +-1.002737, 10.783842, 12.373039, 0.000000, -1.349704, -0.535040, 0.792292, -0.293266, +-1.336982, 10.239292, 12.641662, 0.500000, -1.349954, -0.999218, -0.036495, 0.015192, +-1.336982, 10.239292, 12.641662, 0.500000, -1.349954, -0.999218, -0.036495, 0.015192, +-1.002737, 9.694744, 12.910284, 1.000000, -1.349954, -0.500990, -0.803388, 0.321833, +-1.002737, 10.760361, 14.994465, 1.000000, -1.516370, -0.490912, -0.740187, 0.459488, +-1.002737, 10.760361, 14.994465, 1.000000, -1.516370, -0.490912, -0.740187, 0.459488, +-1.002737, 12.090717, 16.772659, 1.000000, -1.679268, -0.484165, -0.653669, 0.581636, +-1.336982, 12.495934, 16.355419, 0.500000, -1.679268, -0.999037, -0.033130, 0.028753, +-1.336982, 12.495934, 16.355419, 0.500000, -1.679268, -0.999037, -0.033130, 0.028753, +-1.002737, 12.901150, 15.938179, 0.000000, -1.683037, -0.520176, 0.645820, -0.558867, +-1.002737, 11.718807, 14.305887, 0.000000, -1.516370, -0.524951, 0.731928, -0.434405, +-1.002737, 14.227100, 17.202572, 0.000000, -1.834628, -0.519663, 0.527798, -0.671848, +-1.002737, 12.901150, 15.938179, 0.000000, -1.683037, -0.520176, 0.645820, -0.558867, +-1.336982, 12.495934, 16.355419, 0.500000, -1.679268, -0.999037, -0.033130, 0.028753, +-1.336982, 12.495934, 16.355419, 0.500000, -1.679268, -0.999037, -0.033130, 0.028753, +-1.002737, 12.090717, 16.772659, 1.000000, -1.679268, -0.484165, -0.653669, 0.581636, +-1.002737, 13.576077, 18.160946, 1.000000, -1.834628, -0.481336, -0.535363, 0.694048, +-1.002737, 13.576077, 18.160946, 1.000000, -1.834628, -0.481336, -0.535363, 0.694048, +-1.002737, 15.212280, 19.181923, 1.000000, -1.988039, -0.480827, -0.389724, 0.785443, +-1.336982, 15.450417, 18.654261, 0.500000, -1.988039, -0.998886, -0.021466, 0.042031, +-1.336982, 15.450417, 18.654261, 0.500000, -1.988039, -0.998886, -0.021466, 0.042031, +-1.002737, 15.688553, 18.126600, 0.000000, -1.986219, -0.519424, 0.384311, -0.763219, +-1.002737, 14.227100, 17.202572, 0.000000, -1.834628, -0.519663, 0.527798, -0.671848, +-1.002737, 17.277420, 18.737804, 0.000000, -2.145087, -0.519855, 0.222506, -0.824768, +-1.002737, 15.688553, 18.126600, 0.000000, -1.986219, -0.519424, 0.384311, -0.763219, +-1.336982, 15.450417, 18.654261, 0.500000, -1.988039, -0.998886, -0.021466, 0.042031, +-1.336982, 15.450417, 18.654261, 0.500000, -1.988039, -0.998886, -0.021466, 0.042031, +-1.002737, 15.212280, 19.181923, 1.000000, -1.988039, -0.480827, -0.389724, 0.785443, +-1.002737, 16.995155, 19.858189, 1.000000, -2.145087, -0.479530, -0.225145, 0.848151, +-1.002737, 16.995155, 19.858189, 1.000000, -2.145087, -0.479530, -0.225145, 0.848151, +-1.002737, 18.890533, 20.158619, 1.000000, -2.305904, -0.477686, -0.044014, 0.877427, +-1.336982, 18.926823, 19.584188, 0.500000, -2.305904, -0.998704, -0.001978, 0.050855, +-1.336982, 18.926823, 19.584188, 0.500000, -2.305904, -0.998704, -0.001978, 0.050855, +-1.002737, 18.963112, 19.009758, 0.000000, -2.303954, -0.519106, 0.044200, -0.853567, +-1.002737, 17.277420, 18.737804, 0.000000, -2.145087, -0.519855, 0.222506, -0.824768, +-1.002737, 20.715042, 18.916035, 0.000000, -2.470621, -0.518180, -0.147145, -0.842519, +-1.002737, 18.963112, 19.009758, 0.000000, -2.303954, -0.519106, 0.044200, -0.853567, +-1.336982, 18.926823, 19.584188, 0.500000, -2.305904, -0.998704, -0.001978, 0.050855, +-1.336982, 18.926823, 19.584188, 0.500000, -2.305904, -0.998704, -0.001978, 0.050855, +-1.002737, 18.890533, 20.158619, 1.000000, -2.305904, -0.477686, -0.044014, 0.877427, +-1.002737, 20.864250, 20.052088, 1.000000, -2.470621, -0.474232, 0.150976, 0.867358, +-1.002737, 20.864250, 20.052088, 1.000000, -2.470621, -0.474232, 0.150976, 0.867358, +-1.002737, 22.911228, 19.457972, 1.000000, -2.646001, -0.471248, 0.342725, 0.812690, +-1.336982, 22.719658, 18.922981, 0.500000, -2.646001, -0.998523, 0.022590, 0.049420, +-1.336982, 22.719658, 18.922981, 0.500000, -2.646001, -0.998523, 0.022590, 0.049420, +-1.002737, 22.528088, 18.387989, 0.000000, -2.637287, -0.514483, -0.334572, -0.789537, +-1.002737, 20.715042, 18.916035, 0.000000, -2.470621, -0.518180, -0.147145, -0.842519, +-1.002737, 24.397125, 17.356983, 0.000000, -2.838810, -0.512162, -0.495528, -0.701529, +-1.002737, 22.528088, 18.387989, 0.000000, -2.637287, -0.514483, -0.334572, -0.789537, +-1.336982, 22.719658, 18.922981, 0.500000, -2.646001, -0.998523, 0.022590, 0.049420, +-1.336982, 22.719658, 18.922981, 0.500000, -2.646001, -0.998523, 0.022590, 0.049420, +-1.002737, 22.911228, 19.457972, 1.000000, -2.646001, -0.471248, 0.342725, 0.812690, +-1.002737, 25.026405, 18.295650, 1.000000, -2.838810, -0.470077, 0.507995, 0.721781, +-1.002737, 25.026405, 18.295650, 1.000000, -2.838810, -0.470077, 0.507995, 0.721781, +-1.002737, 26.982025, 16.592329, 1.000000, -3.038383, -0.470672, 0.656259, 0.589739, +-1.336982, 26.551086, 16.221825, 0.500000, -3.038383, -0.998387, 0.041476, 0.038776, +-1.336982, 26.551086, 16.221825, 0.500000, -3.038383, -0.998387, 0.041476, 0.038776, +-1.002737, 26.120163, 15.851318, 0.000000, -3.040334, -0.515999, -0.637877, -0.571716, +-1.002737, 24.397125, 17.356983, 0.000000, -2.838810, -0.512162, -0.495528, -0.701529, +-1.002737, 27.495193, 13.899298, 0.000000, -3.234054, -0.529173, -0.759785, -0.377761, +-1.002737, 26.120163, 15.851318, 0.000000, -3.040334, -0.515999, -0.637877, -0.571716, +-1.336982, 26.551086, 16.221825, 0.500000, -3.038383, -0.998387, 0.041476, 0.038776, +-1.336982, 26.551086, 16.221825, 0.500000, -3.038383, -0.998387, 0.041476, 0.038776, +-1.002737, 26.982025, 16.592329, 1.000000, -3.038383, -0.470672, 0.656259, 0.589739, +-1.002737, 28.550339, 14.375221, 1.000000, -3.234054, -0.475606, 0.784875, 0.397203, +-1.002737, 28.550339, 14.375221, 1.000000, -3.234054, -0.475606, 0.784875, 0.397203, +-1.002737, 29.425041, 11.768046, 1.000000, -3.421010, -0.486094, 0.865825, 0.118573, +-1.336982, 28.829937, 11.681159, 0.500000, -3.421010, -0.997287, 0.072725, 0.011376, +-1.336982, 28.829937, 11.681159, 0.500000, -3.421010, -0.997287, 0.072725, 0.011376, +-1.002737, 28.234837, 11.594271, 0.000000, -3.427773, -0.549861, -0.829859, -0.094800, +-1.002737, 27.495193, 13.899298, 0.000000, -3.234054, -0.529173, -0.759785, -0.377761, +-1.002737, 28.051701, 9.029581, 0.000000, -3.594440, -0.552394, -0.818572, 0.157487, +-1.002737, 28.234837, 11.594271, 0.000000, -3.427773, -0.549861, -0.829859, -0.094800, +-1.336982, 28.829937, 11.681159, 0.500000, -3.421010, -0.997287, 0.072725, 0.011376, +-1.336982, 28.829937, 11.681159, 0.500000, -3.421010, -0.997287, 0.072725, 0.011376, +-1.002737, 29.425041, 11.768046, 1.000000, -3.421010, -0.486094, 0.865825, 0.118573, +-1.002737, 29.299828, 8.894522, 1.000000, -3.594440, -0.508085, 0.850361, -0.136877, +-1.002737, 29.299828, 8.894522, 1.000000, -3.594440, -0.508085, 0.850361, -0.136877, +-1.002737, 28.522129, 6.172330, 1.000000, -3.741287, -0.527924, 0.793569, -0.302563, +-1.336982, 27.897224, 6.377859, 0.500000, -3.741288, -0.999306, 0.035287, -0.011950, +-1.336982, 27.897224, 6.377859, 0.500000, -3.741288, -0.999306, 0.035287, -0.011950, +-1.002737, 27.272324, 6.583387, 0.000000, -3.761107, -0.563170, -0.762896, 0.317537, +-1.002737, 28.051701, 9.029581, 0.000000, -3.594440, -0.552394, -0.818572, 0.157487, +-1.002737, 26.223228, 4.633848, 0.000000, -3.848496, -0.571231, -0.699650, 0.429169, +-1.002737, 27.272324, 6.583387, 0.000000, -3.761107, -0.563170, -0.762896, 0.317537, +-1.336982, 27.897224, 6.377859, 0.500000, -3.741288, -0.999306, 0.035287, -0.011950, +-1.336982, 27.897224, 6.377859, 0.500000, -3.741288, -0.999306, 0.035287, -0.011950, +-1.002737, 28.522129, 6.172330, 1.000000, -3.741287, -0.527924, 0.793569, -0.302563, +-1.002737, 27.439381, 4.019153, 1.000000, -3.848496, -0.545786, 0.725589, -0.419091, +-1.002737, 27.439381, 4.019153, 1.000000, -3.848496, -0.545786, 0.725589, -0.419091, +-1.002737, 26.363422, 2.436586, 1.020833, -3.882167, -0.561369, 0.675750, -0.477732, +-1.336982, 25.778152, 2.814326, 0.583333, -3.762508, -0.999924, 0.011227, -0.005182, +-1.336982, 25.778152, 2.814326, 0.583333, -3.762508, -0.999924, 0.011227, -0.005182, +-1.002737, 25.192875, 3.192066, 0.000000, -3.935886, -0.573805, -0.657830, 0.487860, +-1.002737, 26.223228, 4.633848, 0.000000, -3.848496, -0.571231, -0.699650, 0.429169, +-1.002737, 24.600067, 1.327282, 1.166667, -2.723639, -0.595697, -0.491752, -0.635079, +-0.742768, 24.296909, 1.783397, 1.333333, -1.447277, -0.428917, -0.894621, -0.125234, +-1.002737, 24.469711, 2.269146, 0.666667, -2.691582, -0.583534, -0.710408, 0.393458, +-1.002737, 24.469711, 2.269146, 0.666667, -2.691582, -0.583534, -0.710408, 0.393458, +-1.002737, 25.192875, 3.192066, 0.000000, -3.935886, -0.573805, -0.657830, 0.487860, +-1.336982, 25.778152, 2.814326, 0.583333, -3.762508, -0.999924, 0.011227, -0.005182, +-1.336982, 25.778152, 2.814326, 0.583333, -3.762508, -0.999924, 0.011227, -0.005182, +-1.002737, 26.363422, 2.436586, 1.020833, -3.882167, -0.561369, 0.675750, -0.477732, +-1.002737, 25.606094, 1.426226, 1.083333, -3.808398, -0.572183, 0.564519, -0.594916, +-1.002737, 25.606094, 1.426226, 1.083333, -3.808398, -0.572183, 0.564519, -0.594916, +-0.742768, 25.130249, 1.141007, 1.000000, -4.000000, -0.424007, 0.088516, -0.901323, +-1.002737, 24.600067, 1.327282, 1.166667, -2.723639, -0.595697, -0.491752, -0.635079, +1.002737, 3.502487, -29.476650, 2.000000, 0.966243, 0.570521, -0.819696, 0.051023, +1.002737, 3.589725, -28.074989, 2.000000, 0.922656, 0.569426, -0.818637, 0.074745, +0.000000, 3.355162, -28.055641, 1.500000, 0.922656, -0.000000, -0.995829, 0.091245, +0.000000, 3.355162, -28.055641, 1.500000, 0.922656, -0.000000, -0.995829, 0.091245, +-1.002737, 3.589727, -28.074986, 1.000000, 0.922656, -0.569426, -0.818637, 0.074745, +-1.002737, 3.502487, -29.476650, 1.000000, 0.966243, -0.570521, -0.819696, 0.051023, +-1.002737, 3.807196, -26.139326, 1.000000, 0.859409, -0.566467, -0.814177, 0.127399, +-1.002737, 3.589727, -28.074986, 1.000000, 0.922656, -0.569426, -0.818637, 0.074745, +0.000000, 3.355162, -28.055641, 1.500000, 0.922656, -0.000000, -0.995829, 0.091245, +0.000000, 3.355162, -28.055641, 1.500000, 0.922656, -0.000000, -0.995829, 0.091245, +1.002737, 3.589725, -28.074989, 2.000000, 0.922656, 0.569426, -0.818637, 0.074745, +1.002737, 3.807196, -26.139326, 2.000000, 0.859409, 0.566467, -0.814178, 0.127399, +1.002737, 3.807196, -26.139326, 2.000000, 0.859409, 0.566467, -0.814178, 0.127399, +1.002737, 4.261988, -23.779171, 2.000000, 0.775297, 0.564634, -0.800896, 0.199384, +0.000000, 4.032219, -23.733923, 1.500000, 0.775297, 0.000000, -0.970479, 0.241185, +0.000000, 4.032219, -23.733923, 1.500000, 0.775297, 0.000000, -0.970479, 0.241185, +-1.002737, 4.261988, -23.779169, 1.000000, 0.775297, -0.564634, -0.800896, 0.199384, +-1.002737, 3.807196, -26.139326, 1.000000, 0.859409, -0.566467, -0.814177, 0.127399, +-1.002737, 5.061195, -21.104027, 1.000000, 0.669113, -0.566458, -0.779905, 0.266220, +-1.002737, 4.261988, -23.779169, 1.000000, 0.775297, -0.564634, -0.800896, 0.199384, +0.000000, 4.032219, -23.733923, 1.500000, 0.775297, 0.000000, -0.970479, 0.241185, +0.000000, 4.032219, -23.733923, 1.500000, 0.775297, 0.000000, -0.970479, 0.241185, +1.002737, 4.261988, -23.779171, 2.000000, 0.775297, 0.564634, -0.800896, 0.199384, +1.002737, 5.061195, -21.104025, 2.000000, 0.669113, 0.566458, -0.779905, 0.266220, +1.002737, 5.061195, -21.104025, 2.000000, 0.669113, 0.566458, -0.779905, 0.266220, +1.002737, 6.120935, -18.335461, 2.000000, 0.547971, 0.566613, -0.758528, 0.321845, +0.000000, 5.893641, -18.274008, 1.500000, 0.547971, -0.000000, -0.920850, 0.389917, +0.000000, 5.893641, -18.274008, 1.500000, 0.547971, -0.000000, -0.920850, 0.389917, +-1.002737, 6.120935, -18.335461, 1.000000, 0.547971, -0.566613, -0.758528, 0.321845, +-1.002737, 5.061195, -21.104027, 1.000000, 0.669113, -0.566458, -0.779905, 0.266220, +-1.002737, 7.357327, -15.695049, 1.000000, 0.418984, -0.568348, -0.740553, 0.358555, +-1.002737, 6.120935, -18.335461, 1.000000, 0.547971, -0.566613, -0.758528, 0.321845, +0.000000, 5.893641, -18.274008, 1.500000, 0.547971, -0.000000, -0.920850, 0.389917, +0.000000, 5.893641, -18.274008, 1.500000, 0.547971, -0.000000, -0.920850, 0.389917, +1.002737, 6.120935, -18.335461, 2.000000, 0.547971, 0.566613, -0.758528, 0.321845, +1.002737, 7.357327, -15.695049, 2.000000, 0.418984, 0.568348, -0.740553, 0.358555, +1.002737, 7.357327, -15.695049, 2.000000, 0.418984, 0.568348, -0.740553, 0.358555, +1.002737, 8.627859, -13.158705, 2.000000, 0.282904, 0.571429, -0.737705, 0.359528, +0.000000, 8.398937, -13.100854, 1.500000, 0.282904, 0.000000, -0.898731, 0.438502, +0.000000, 8.398937, -13.100854, 1.500000, 0.282904, 0.000000, -0.898731, 0.438502, +-1.002737, 8.627859, -13.158705, 1.000000, 0.282904, -0.571429, -0.737705, 0.359528, +-1.002737, 7.357327, -15.695049, 1.000000, 0.418984, -0.568348, -0.740553, 0.358555, +-1.002737, 9.790028, -10.702334, 1.000000, 0.140482, -0.576949, -0.747604, 0.328966, +-1.002737, 8.627859, -13.158705, 1.000000, 0.282904, -0.571429, -0.737705, 0.359528, +0.000000, 8.398937, -13.100854, 1.500000, 0.282904, 0.000000, -0.898731, 0.438502, +0.000000, 8.398937, -13.100854, 1.500000, 0.282904, 0.000000, -0.898731, 0.438502, +1.002737, 8.627859, -13.158705, 2.000000, 0.282904, 0.571429, -0.737705, 0.359528, +1.002737, 9.790028, -10.702334, 2.000000, 0.140482, 0.576977, -0.747533, 0.329077, +1.002737, 9.790028, -10.702334, 2.000000, 0.140482, 0.576977, -0.747533, 0.329077, +1.002127, 10.657795, -8.543959, 2.000000, 0.010562, 0.588607, -0.767452, 0.254084, +-0.000610, 10.425087, -8.501664, 1.500000, 0.010562, 0.000044, -0.949091, 0.315003, +-0.000610, 10.425087, -8.501664, 1.500000, 0.010562, 0.000044, -0.949091, 0.315003, +-1.003346, 10.657795, -8.543959, 1.020833, -0.009381, -0.588551, -0.767718, 0.253411, +-1.002737, 9.790028, -10.702334, 1.000000, 0.140482, -0.576949, -0.747604, 0.328966, +-1.005175, 11.045135, -6.901599, 1.083333, -0.167786, -0.591577, -0.797310, 0.119726, +-1.003346, 10.657795, -8.543959, 1.020833, -0.009381, -0.588551, -0.767718, 0.253411, +-0.000610, 10.425087, -8.501664, 1.500000, 0.010562, 0.000044, -0.949091, 0.315003, +-0.000610, 10.425087, -8.501664, 1.500000, 0.010562, 0.000044, -0.949091, 0.315003, +1.002127, 10.657795, -8.543959, 2.000000, 0.010562, 0.588607, -0.767452, 0.254084, +1.000299, 11.045135, -6.901599, 2.000000, -0.088013, 0.591516, -0.797171, 0.120947, +1.000299, 11.045135, -6.901599, 2.000000, -0.088013, 0.591516, -0.797171, 0.120947, +0.999079, 11.114811, -5.517140, 2.000000, -0.170915, 0.582792, -0.812607, -0.004817, +-0.003657, 10.880220, -5.483850, 1.500000, -0.170915, -0.000127, -0.999975, -0.007088, +-0.003657, 10.880220, -5.483850, 1.500000, -0.170915, -0.000127, -0.999975, -0.007088, +-1.006394, 11.114811, -5.517140, 1.000000, -0.170915, -0.583093, -0.812392, -0.004755, +-1.005175, 11.045135, -6.901599, 1.083333, -0.167786, -0.591577, -0.797310, 0.119726, +-1.002737, 10.154959, -0.010050, 1.000000, -0.503387, -0.554465, -0.809442, -0.193318, +-1.003346, 10.729588, -2.409474, 1.000000, -0.336720, -0.568927, -0.804482, -0.170679, +-0.000610, 10.494156, -2.383091, 1.500000, -0.336720, 0.000040, -0.977947, -0.208854, +-0.000610, 10.494156, -2.383091, 1.500000, -0.336720, 0.000040, -0.977947, -0.208854, +1.002127, 10.729588, -2.409474, 2.000000, -0.336720, 0.568931, -0.804350, -0.171283, +1.002737, 10.154957, -0.010050, 2.000000, -0.503387, 0.554487, -0.809403, -0.193422, +1.002737, 10.154957, -0.010050, 2.000000, -0.503387, 0.554487, -0.809403, -0.193422, +1.002737, 9.503082, 2.725576, 2.000000, -0.671927, 0.543427, -0.820485, -0.177458, +0.000000, 9.272461, 2.752070, 1.500000, -0.671927, -0.000000, -0.977791, -0.209581, +0.000000, 9.272461, 2.752070, 1.500000, -0.671927, -0.000000, -0.977791, -0.209581, +-1.002737, 9.503082, 2.725576, 1.000000, -0.671927, -0.543427, -0.820485, -0.177458, +-1.002737, 10.154959, -0.010050, 1.000000, -0.503387, -0.554465, -0.809442, -0.193318, +-1.002737, 8.971350, 5.457178, 1.000000, -0.844213, -0.532911, -0.837943, -0.117722, +-1.002737, 9.503082, 2.725576, 1.000000, -0.671927, -0.543427, -0.820485, -0.177458, +0.000000, 9.272461, 2.752070, 1.500000, -0.671927, -0.000000, -0.977791, -0.209581, +0.000000, 9.272461, 2.752070, 1.500000, -0.671927, -0.000000, -0.977791, -0.209581, +1.002737, 9.503082, 2.725576, 2.000000, -0.671927, 0.543427, -0.820485, -0.177458, +1.002737, 8.971350, 5.457179, 2.000000, -0.844213, 0.532911, -0.837943, -0.117722, +1.002737, 8.971350, 5.457179, 2.000000, -0.844213, 0.532911, -0.837943, -0.117722, +1.002737, 8.743584, 8.108689, 2.000000, -1.016250, 0.522039, -0.852900, 0.006099, +0.000000, 8.530107, 8.155542, 1.500000, -1.016250, 0.000000, -0.999937, 0.011225, +0.000000, 8.530107, 8.155542, 1.500000, -1.016250, 0.000000, -0.999937, 0.011225, +-1.002737, 8.743584, 8.108688, 1.000000, -1.016250, -0.522039, -0.852900, 0.006099, +-1.002737, 8.971350, 5.457178, 1.000000, -0.844213, -0.532911, -0.837943, -0.117722, +-1.002737, 9.003599, 10.604042, 1.000000, -1.184038, -0.512969, -0.841946, 0.167304, +-1.002737, 8.743584, 8.108688, 1.000000, -1.016250, -0.522039, -0.852900, 0.006099, +0.000000, 8.530107, 8.155542, 1.500000, -1.016250, 0.000000, -0.999937, 0.011225, +0.000000, 8.530107, 8.155542, 1.500000, -1.016250, 0.000000, -0.999937, 0.011225, +1.002737, 8.743584, 8.108689, 2.000000, -1.016250, 0.522039, -0.852900, 0.006099, +1.002737, 9.003599, 10.604041, 2.000000, -1.184038, 0.512969, -0.841946, 0.167304, +1.002737, 9.003599, 10.604041, 2.000000, -1.184038, 0.512969, -0.841946, 0.167304, +1.002737, 9.694744, 12.910284, 2.000000, -1.349954, 0.500990, -0.803388, 0.321833, +0.000000, 9.513226, 12.999825, 1.500000, -1.349954, 0.000000, -0.927387, 0.374104, +0.000000, 9.513226, 12.999825, 1.500000, -1.349954, 0.000000, -0.927387, 0.374104, +-1.002737, 9.694744, 12.910284, 1.000000, -1.349954, -0.500990, -0.803388, 0.321833, +-1.002737, 9.003599, 10.604042, 1.000000, -1.184038, -0.512969, -0.841946, 0.167304, +-1.002737, 10.760361, 14.994465, 1.000000, -1.516370, -0.490912, -0.740187, 0.459488, +-1.002737, 9.694744, 12.910284, 1.000000, -1.349954, -0.500990, -0.803388, 0.321833, +0.000000, 9.513226, 12.999825, 1.500000, -1.349954, 0.000000, -0.927387, 0.374104, +0.000000, 9.513226, 12.999825, 1.500000, -1.349954, 0.000000, -0.927387, 0.374104, +1.002737, 9.694744, 12.910284, 2.000000, -1.349954, 0.500990, -0.803388, 0.321833, +1.002737, 10.760361, 14.994465, 2.000000, -1.516370, 0.490912, -0.740187, 0.459488, +1.002737, 10.760361, 14.994465, 2.000000, -1.516370, 0.490912, -0.740187, 0.459488, +1.002737, 12.090717, 16.772659, 2.000000, -1.679268, 0.484165, -0.653669, 0.581636, +0.000000, 11.955647, 16.911739, 1.500000, -1.679268, 0.000000, -0.746148, 0.665780, +0.000000, 11.955647, 16.911739, 1.500000, -1.679268, 0.000000, -0.746148, 0.665780, +-1.002737, 12.090717, 16.772659, 1.000000, -1.679268, -0.484165, -0.653669, 0.581636, +-1.002737, 10.760361, 14.994465, 1.000000, -1.516370, -0.490912, -0.740187, 0.459488, +-1.002737, 13.576077, 18.160946, 1.000000, -1.834628, -0.481336, -0.535363, 0.694048, +-1.002737, 12.090717, 16.772659, 1.000000, -1.679268, -0.484165, -0.653669, 0.581636, +0.000000, 11.955647, 16.911739, 1.500000, -1.679268, 0.000000, -0.746148, 0.665780, +0.000000, 11.955647, 16.911739, 1.500000, -1.679268, 0.000000, -0.746148, 0.665780, +1.002737, 12.090717, 16.772659, 2.000000, -1.679268, 0.484165, -0.653669, 0.581636, +1.002737, 13.576080, 18.160946, 2.000000, -1.834628, 0.481336, -0.535363, 0.694048, +1.002737, 13.576080, 18.160946, 2.000000, -1.834628, 0.481336, -0.535363, 0.694048, +1.002737, 15.212280, 19.181923, 2.000000, -1.988039, 0.480828, -0.389724, 0.785442, +0.000000, 15.132900, 19.357809, 1.500000, -1.988039, 0.000001, -0.443892, 0.896080, +0.000000, 15.132900, 19.357809, 1.500000, -1.988039, 0.000001, -0.443892, 0.896080, +-1.002737, 15.212280, 19.181923, 1.000000, -1.988039, -0.480827, -0.389724, 0.785443, +-1.002737, 13.576077, 18.160946, 1.000000, -1.834628, -0.481336, -0.535363, 0.694048, +-1.002737, 16.995155, 19.858189, 1.000000, -2.145087, -0.479530, -0.225145, 0.848151, +-1.002737, 15.212280, 19.181923, 1.000000, -1.988039, -0.480827, -0.389724, 0.785443, +0.000000, 15.132900, 19.357809, 1.500000, -1.988039, 0.000001, -0.443892, 0.896080, +0.000000, 15.132900, 19.357809, 1.500000, -1.988039, 0.000001, -0.443892, 0.896080, +1.002737, 15.212280, 19.181923, 2.000000, -1.988039, 0.480828, -0.389724, 0.785442, +1.002737, 16.995155, 19.858189, 2.000000, -2.145087, 0.479530, -0.225145, 0.848151, +1.002737, 16.995155, 19.858189, 2.000000, -2.145087, 0.479530, -0.225145, 0.848151, +1.002737, 18.890533, 20.158619, 2.000000, -2.305904, 0.477686, -0.044014, 0.877427, +0.000000, 18.878441, 20.350098, 1.500000, -2.305904, 0.000000, -0.050074, 0.998746, +0.000000, 18.878441, 20.350098, 1.500000, -2.305904, 0.000000, -0.050074, 0.998746, +-1.002737, 18.890533, 20.158619, 1.000000, -2.305904, -0.477686, -0.044014, 0.877427, +-1.002737, 16.995155, 19.858189, 1.000000, -2.145087, -0.479530, -0.225145, 0.848151, +-1.002737, 20.864250, 20.052088, 1.000000, -2.470621, -0.474232, 0.150976, 0.867358, +-1.002737, 18.890533, 20.158619, 1.000000, -2.305904, -0.477686, -0.044014, 0.877427, +0.000000, 18.878441, 20.350098, 1.500000, -2.305904, 0.000000, -0.050074, 0.998746, +0.000000, 18.878441, 20.350098, 1.500000, -2.305904, 0.000000, -0.050074, 0.998746, +1.002737, 18.890533, 20.158619, 2.000000, -2.305904, 0.477686, -0.044014, 0.877427, +1.002737, 20.864250, 20.052088, 2.000000, -2.470621, 0.474231, 0.150976, 0.867359, +1.002737, 20.864250, 20.052088, 2.000000, -2.470621, 0.474231, 0.150976, 0.867359, +1.002737, 22.911228, 19.457972, 2.000000, -2.646001, 0.471248, 0.342725, 0.812690, +0.000000, 22.975082, 19.636301, 1.500000, -2.646001, 0.000000, 0.388135, 0.921603, +0.000000, 22.975082, 19.636301, 1.500000, -2.646001, 0.000000, 0.388135, 0.921603, +-1.002737, 22.911228, 19.457972, 1.000000, -2.646001, -0.471248, 0.342725, 0.812690, +-1.002737, 20.864250, 20.052088, 1.000000, -2.470621, -0.474232, 0.150976, 0.867358, +-1.002737, 25.026405, 18.295650, 1.000000, -2.838810, -0.470077, 0.507995, 0.721781, +-1.002737, 22.911228, 19.457972, 1.000000, -2.646001, -0.471248, 0.342725, 0.812690, +0.000000, 22.975082, 19.636301, 1.500000, -2.646001, 0.000000, 0.388135, 0.921603, +0.000000, 22.975082, 19.636301, 1.500000, -2.646001, 0.000000, 0.388135, 0.921603, +1.002737, 22.911228, 19.457972, 2.000000, -2.646001, 0.471248, 0.342725, 0.812690, +1.002737, 25.026405, 18.295650, 2.000000, -2.838810, 0.470077, 0.507995, 0.721781, +1.002737, 25.026405, 18.295650, 2.000000, -2.838810, 0.470077, 0.507995, 0.721781, +1.002737, 26.982021, 16.592329, 2.000000, -3.038383, 0.470672, 0.656258, 0.589740, +0.000000, 27.125668, 16.715830, 1.500000, -3.038383, 0.000001, 0.743876, 0.668318, +0.000000, 27.125668, 16.715830, 1.500000, -3.038383, 0.000001, 0.743876, 0.668318, +-1.002737, 26.982025, 16.592329, 1.000000, -3.038383, -0.470672, 0.656259, 0.589739, +-1.002737, 25.026405, 18.295650, 1.000000, -2.838810, -0.470077, 0.507995, 0.721781, +-1.002737, 28.550339, 14.375221, 1.000000, -3.234054, -0.475606, 0.784875, 0.397203, +-1.002737, 26.982025, 16.592329, 1.000000, -3.038383, -0.470672, 0.656259, 0.589739, +0.000000, 27.125668, 16.715830, 1.500000, -3.038383, 0.000001, 0.743876, 0.668318, +0.000000, 27.125668, 16.715830, 1.500000, -3.038383, 0.000001, 0.743876, 0.668318, +1.002737, 26.982021, 16.592329, 2.000000, -3.038383, 0.470672, 0.656258, 0.589740, +1.002737, 28.550339, 14.375221, 2.000000, -3.234054, 0.475606, 0.784875, 0.397204, +1.002737, 28.550339, 14.375221, 2.000000, -3.234054, 0.475606, 0.784875, 0.397204, +1.002737, 29.425041, 11.768046, 2.000000, -3.421010, 0.486093, 0.865826, 0.118573, +0.000000, 29.623409, 11.797009, 1.500000, -3.421010, 0.000000, 0.990552, 0.137137, +0.000000, 29.623409, 11.797009, 1.500000, -3.421010, 0.000000, 0.990552, 0.137137, +-1.002737, 29.425041, 11.768046, 1.000000, -3.421010, -0.486094, 0.865825, 0.118573, +-1.002737, 28.550339, 14.375221, 1.000000, -3.234054, -0.475606, 0.784875, 0.397203, +-1.002737, 29.299828, 8.894522, 1.000000, -3.594440, -0.508085, 0.850361, -0.136877, +-1.002737, 29.425041, 11.768046, 1.000000, -3.421010, -0.486094, 0.865825, 0.118573, +0.000000, 29.623409, 11.797009, 1.500000, -3.421010, 0.000000, 0.990552, 0.137137, +0.000000, 29.623409, 11.797009, 1.500000, -3.421010, 0.000000, 0.990552, 0.137137, +1.002737, 29.425041, 11.768046, 2.000000, -3.421010, 0.486093, 0.865826, 0.118573, +1.002737, 29.299828, 8.894522, 2.000000, -3.594440, 0.508084, 0.850362, -0.136877, +1.002737, 29.299828, 8.894522, 2.000000, -3.594440, 0.508084, 0.850362, -0.136877, +1.002737, 28.522129, 6.172330, 2.000000, -3.741287, 0.527923, 0.793569, -0.302564, +0.000000, 28.730427, 6.103821, 1.500000, -3.741288, 0.000000, 0.935308, -0.353834, +0.000000, 28.730427, 6.103821, 1.500000, -3.741288, 0.000000, 0.935308, -0.353834, +-1.002737, 28.522129, 6.172330, 1.000000, -3.741287, -0.527924, 0.793569, -0.302563, +-1.002737, 29.299828, 8.894522, 1.000000, -3.594440, -0.508085, 0.850361, -0.136877, +-1.002737, 27.439381, 4.019153, 1.000000, -3.848496, -0.545786, 0.725589, -0.419091, +-1.002737, 28.522129, 6.172330, 1.000000, -3.741287, -0.527924, 0.793569, -0.302563, +0.000000, 28.730427, 6.103821, 1.500000, -3.741288, 0.000000, 0.935308, -0.353834, +0.000000, 28.730427, 6.103821, 1.500000, -3.741288, 0.000000, 0.935308, -0.353834, +1.002737, 28.522129, 6.172330, 2.000000, -3.741287, 0.527923, 0.793569, -0.302564, +1.002737, 27.439377, 4.019153, 2.000000, -3.848496, 0.545786, 0.725589, -0.419091, +1.002737, 27.439377, 4.019153, 2.000000, -3.848496, 0.545786, 0.725589, -0.419091, +1.002737, 26.363422, 2.436586, 2.000000, -3.922053, 0.561369, 0.675750, -0.477732, +0.000000, 26.558514, 2.310673, 1.500000, -3.922053, 0.000001, 0.817607, -0.575776, +0.000000, 26.558514, 2.310673, 1.500000, -3.922053, 0.000001, 0.817607, -0.575776, +-1.002737, 26.363422, 2.436586, 1.020833, -3.882167, -0.561369, 0.675750, -0.477732, +-1.002737, 27.439381, 4.019153, 1.000000, -3.848496, -0.545786, 0.725589, -0.419091, +0.000000, 25.158775, 0.885566, 1.500000, -4.000000, 0.000000, 0.098978, -0.995090, +-0.742768, 25.130249, 1.141007, 1.000000, -4.000000, -0.424007, 0.088516, -0.901323, +-1.002737, 25.606094, 1.426226, 1.083333, -3.808398, -0.572183, 0.564519, -0.594916, +-1.002737, 25.606094, 1.426226, 1.083333, -3.808398, -0.572183, 0.564519, -0.594916, +-1.002737, 26.363422, 2.436586, 1.020833, -3.882167, -0.561369, 0.675750, -0.477732, +0.000000, 26.558514, 2.310673, 1.500000, -3.922053, 0.000001, 0.817607, -0.575776, +0.000000, 26.558514, 2.310673, 1.500000, -3.922053, 0.000001, 0.817607, -0.575776, +1.002737, 26.363422, 2.436586, 2.000000, -3.922053, 0.561369, 0.675750, -0.477732, +1.002737, 25.606094, 1.426226, 2.000000, -3.967943, 0.572183, 0.564519, -0.594916, +1.002737, 25.606094, 1.426226, 2.000000, -3.967943, 0.572183, 0.564519, -0.594916, +0.742768, 25.130249, 1.141007, 2.000000, -4.000000, 0.424007, 0.088516, -0.901323, +0.000000, 25.158775, 0.885566, 1.500000, -4.000000, 0.000000, 0.098978, -0.995090, +1.002737, 4.921762, -29.530731, 3.000000, 0.966243, 0.582240, 0.811733, -0.045667, +1.002737, 4.997122, -28.191074, 3.000000, 0.922656, 0.582175, 0.810004, -0.070467, +1.336982, 4.293425, -28.133030, 2.500000, 0.922656, 0.999926, -0.012083, 0.001603, +1.336982, 4.293425, -28.133030, 2.500000, 0.922656, 0.999926, -0.012083, 0.001603, +1.002737, 3.589725, -28.074989, 2.000000, 0.922656, 0.569426, -0.818637, 0.074745, +1.002737, 3.502487, -29.476650, 2.000000, 0.966243, 0.570521, -0.819696, 0.051023, +1.002737, 3.807196, -26.139326, 2.000000, 0.859409, 0.566467, -0.814178, 0.127399, +1.002737, 3.589725, -28.074989, 2.000000, 0.922656, 0.569426, -0.818637, 0.074745, +1.336982, 4.293425, -28.133030, 2.500000, 0.922656, 0.999926, -0.012083, 0.001603, +1.336982, 4.293425, -28.133030, 2.500000, 0.922656, 0.999926, -0.012083, 0.001603, +1.002737, 4.997122, -28.191074, 3.000000, 0.922656, 0.582175, 0.810004, -0.070467, +1.002737, 5.199909, -26.333269, 3.000000, 0.859409, 0.582690, 0.803052, -0.124820, +1.002737, 5.199909, -26.333269, 3.000000, 0.859409, 0.582690, 0.803052, -0.124820, +1.002737, 5.640600, -24.050657, 3.000000, 0.775297, 0.583127, 0.787897, -0.197941, +1.336982, 4.951294, -23.914915, 2.500000, 0.775297, 0.999837, -0.017439, 0.004781, +1.336982, 4.951294, -23.914915, 2.500000, 0.775297, 0.999837, -0.017439, 0.004781, +1.002737, 4.261988, -23.779171, 2.000000, 0.775297, 0.564634, -0.800896, 0.199384, +1.002737, 3.807196, -26.139326, 2.000000, 0.859409, 0.566467, -0.814178, 0.127399, +1.002737, 5.061195, -21.104025, 2.000000, 0.669113, 0.566458, -0.779905, 0.266220, +1.002737, 4.261988, -23.779171, 2.000000, 0.775297, 0.564634, -0.800896, 0.199384, +1.336982, 4.951294, -23.914915, 2.500000, 0.775297, 0.999837, -0.017439, 0.004781, +1.336982, 4.951294, -23.914915, 2.500000, 0.775297, 0.999837, -0.017439, 0.004781, +1.002737, 5.640600, -24.050657, 3.000000, 0.775297, 0.583127, 0.787897, -0.197941, +1.002737, 6.429670, -21.436577, 3.000000, 0.669113, 0.579786, 0.770207, -0.265761, +1.002737, 6.429670, -21.436577, 3.000000, 0.669113, 0.579786, 0.770207, -0.265761, +1.002737, 7.484703, -18.704170, 3.000000, 0.547971, 0.576888, 0.751119, -0.320970, +1.336982, 6.802818, -18.519814, 2.500000, 0.547971, 0.999946, -0.009100, 0.005070, +1.336982, 6.802818, -18.519814, 2.500000, 0.547971, 0.999946, -0.009100, 0.005070, +1.002737, 6.120935, -18.335461, 2.000000, 0.547971, 0.566613, -0.758528, 0.321845, +1.002737, 5.061195, -21.104025, 2.000000, 0.669113, 0.566458, -0.779905, 0.266220, +1.002737, 7.357327, -15.695049, 2.000000, 0.418984, 0.568348, -0.740553, 0.358555, +1.002737, 6.120935, -18.335461, 2.000000, 0.547971, 0.566613, -0.758528, 0.321845, +1.336982, 6.802818, -18.519814, 2.500000, 0.547971, 0.999946, -0.009100, 0.005070, +1.336982, 6.802818, -18.519814, 2.500000, 0.547971, 0.999946, -0.009100, 0.005070, +1.002737, 7.484703, -18.704170, 3.000000, 0.547971, 0.576888, 0.751119, -0.320970, +1.002737, 8.723274, -16.066572, 3.000000, 0.418984, 0.570576, 0.739144, -0.357922, +1.002737, 8.723274, -16.066572, 3.000000, 0.418984, 0.570576, 0.739144, -0.357922, +1.002737, 10.001389, -13.505806, 3.000000, 0.282904, 0.565597, 0.742254, -0.359389, +1.336982, 9.314625, -13.332256, 2.500000, 0.282904, 0.999983, 0.005126, -0.002905, +1.336982, 9.314625, -13.332256, 2.500000, 0.282904, 0.999983, 0.005126, -0.002905, +1.002737, 8.627859, -13.158705, 2.000000, 0.282904, 0.571429, -0.737705, 0.359528, +1.002737, 7.357327, -15.695049, 2.000000, 0.418984, 0.568348, -0.740553, 0.358555, +1.002737, 9.790028, -10.702334, 2.000000, 0.140482, 0.576977, -0.747533, 0.329077, +1.002737, 8.627859, -13.158705, 2.000000, 0.282904, 0.571429, -0.737705, 0.359528, +1.336982, 9.314625, -13.332256, 2.500000, 0.282904, 0.999983, 0.005126, -0.002905, +1.336982, 9.314625, -13.332256, 2.500000, 0.282904, 0.999983, 0.005126, -0.002905, +1.002737, 10.001389, -13.505806, 3.000000, 0.282904, 0.565597, 0.742254, -0.359389, +1.002737, 11.175043, -11.003893, 3.000000, 0.140482, 0.562569, 0.757951, -0.330192, +1.002737, 11.175043, -11.003893, 3.000000, 0.140482, 0.562569, 0.757951, -0.330192, +1.002127, 12.054029, -8.797724, 2.958333, -0.009381, 0.560195, 0.787255, -0.257702, +1.336373, 11.355911, -8.670841, 2.500000, 0.010562, 0.999602, 0.026239, -0.010414, +1.336373, 11.355911, -8.670841, 2.500000, 0.010562, 0.999602, 0.026239, -0.010414, +1.002127, 10.657795, -8.543959, 2.000000, 0.010562, 0.588607, -0.767452, 0.254084, +1.002737, 9.790028, -10.702334, 2.000000, 0.140482, 0.576977, -0.747533, 0.329077, +1.333325, 11.818588, -5.617008, 2.500000, -0.170915, 0.999852, 0.017082, 0.001868, +0.999079, 11.114811, -5.517140, 2.000000, -0.170915, 0.582792, -0.812607, -0.004817, +1.000299, 11.045135, -6.901599, 2.000000, -0.088013, 0.591516, -0.797171, 0.120947, +1.000299, 11.045135, -6.901599, 2.000000, -0.088013, 0.591516, -0.797171, 0.120947, +1.002127, 10.657795, -8.543959, 2.000000, 0.010562, 0.588607, -0.767452, 0.254084, +1.336373, 11.355911, -8.670841, 2.500000, 0.010562, 0.999602, 0.026239, -0.010414, +1.336373, 11.355911, -8.670841, 2.500000, 0.010562, 0.999602, 0.026239, -0.010414, +1.002127, 12.054029, -8.797724, 2.958333, -0.009381, 0.560195, 0.787255, -0.257702, +1.000299, 12.448139, -7.124194, 2.833333, -0.167786, 0.564659, 0.816023, -0.123558, +1.000299, 12.448139, -7.124194, 2.833333, -0.167786, 0.564659, 0.816023, -0.123558, +0.999079, 12.522362, -5.716876, 3.000000, -0.170915, 0.565733, 0.824587, 0.001687, +1.333325, 11.818588, -5.617008, 2.500000, -0.170915, 0.999852, 0.017082, 0.001868, +1.002737, 10.154957, -0.010050, 2.000000, -0.503387, 0.554487, -0.809403, -0.193422, +1.002127, 10.729588, -2.409474, 2.000000, -0.336720, 0.568931, -0.804350, -0.171283, +1.336373, 11.435898, -2.488622, 2.500000, -0.336720, 0.999684, 0.024018, 0.007427, +1.336373, 11.435898, -2.488622, 2.500000, -0.336720, 0.999684, 0.024018, 0.007427, +1.002127, 12.142200, -2.567771, 3.000000, -0.336720, 0.545588, 0.819894, 0.173516, +1.002737, 11.560024, -0.158328, 3.000000, -0.503387, 0.548192, 0.812432, 0.198592, +1.002737, 11.560024, -0.158328, 3.000000, -0.503387, 0.548192, 0.812432, 0.198592, +1.002737, 10.886791, 2.566613, 3.000000, -0.671927, 0.549613, 0.814083, 0.187601, +1.336982, 10.194935, 2.646095, 2.500000, -0.671927, 0.999975, -0.006839, -0.001674, +1.336982, 10.194935, 2.646095, 2.500000, -0.671927, 0.999975, -0.006839, -0.001674, +1.002737, 9.503082, 2.725576, 2.000000, -0.671927, 0.543427, -0.820485, -0.177458, +1.002737, 10.154957, -0.010050, 2.000000, -0.503387, 0.554487, -0.809403, -0.193422, +1.002737, 8.971350, 5.457179, 2.000000, -0.844213, 0.532911, -0.837943, -0.117722, +1.002737, 9.503082, 2.725576, 2.000000, -0.671927, 0.543427, -0.820485, -0.177458, +1.336982, 10.194935, 2.646095, 2.500000, -0.671927, 0.999975, -0.006839, -0.001674, +1.336982, 10.194935, 2.646095, 2.500000, -0.671927, 0.999975, -0.006839, -0.001674, +1.002737, 10.886791, 2.566613, 3.000000, -0.671927, 0.549613, 0.814083, 0.187601, +1.002737, 10.314148, 5.254678, 3.000000, -0.844213, 0.550065, 0.824042, 0.135587, +1.002737, 10.314148, 5.254678, 3.000000, -0.844213, 0.550065, 0.824042, 0.135587, +1.002737, 10.024445, 7.827566, 3.000000, -1.016250, 0.552727, 0.833125, 0.019881, +1.336982, 9.384014, 7.968127, 2.500000, -1.016250, 0.999385, -0.034959, -0.002597, +1.336982, 9.384014, 7.968127, 2.500000, -1.016250, 0.999385, -0.034959, -0.002597, +1.002737, 8.743584, 8.108689, 2.000000, -1.016250, 0.522039, -0.852900, 0.006099, +1.002737, 8.971350, 5.457179, 2.000000, -0.844213, 0.532911, -0.837943, -0.117722, +1.002737, 9.003599, 10.604041, 2.000000, -1.184038, 0.512969, -0.841946, 0.167304, +1.002737, 8.743584, 8.108689, 2.000000, -1.016250, 0.522039, -0.852900, 0.006099, +1.336982, 9.384014, 7.968127, 2.500000, -1.016250, 0.999385, -0.034959, -0.002597, +1.336982, 9.384014, 7.968127, 2.500000, -1.016250, 0.999385, -0.034959, -0.002597, +1.002737, 10.024445, 7.827566, 3.000000, -1.016250, 0.552727, 0.833125, 0.019881, +1.002737, 10.200031, 10.206976, 3.000000, -1.184038, 0.545898, 0.826469, -0.137636, +1.002737, 10.200031, 10.206976, 3.000000, -1.184038, 0.545898, 0.826469, -0.137636, +1.002737, 10.783842, 12.373039, 3.000000, -1.349954, 0.535040, 0.792292, -0.293267, +1.336982, 10.239292, 12.641662, 2.500000, -1.349954, 0.999218, -0.036495, 0.015192, +1.336982, 10.239292, 12.641662, 2.500000, -1.349954, 0.999218, -0.036495, 0.015192, +1.002737, 9.694744, 12.910284, 2.000000, -1.349954, 0.500990, -0.803388, 0.321833, +1.002737, 9.003599, 10.604041, 2.000000, -1.184038, 0.512969, -0.841946, 0.167304, +1.002737, 10.760361, 14.994465, 2.000000, -1.516370, 0.490912, -0.740187, 0.459488, +1.002737, 9.694744, 12.910284, 2.000000, -1.349954, 0.500990, -0.803388, 0.321833, +1.336982, 10.239292, 12.641662, 2.500000, -1.349954, 0.999218, -0.036495, 0.015192, +1.336982, 10.239292, 12.641662, 2.500000, -1.349954, 0.999218, -0.036495, 0.015192, +1.002737, 10.783842, 12.373039, 3.000000, -1.349954, 0.535040, 0.792292, -0.293267, +1.002737, 11.718807, 14.305887, 3.000000, -1.516370, 0.524951, 0.731928, -0.434405, +1.002737, 11.718807, 14.305887, 3.000000, -1.516370, 0.524951, 0.731928, -0.434405, +1.002737, 12.901150, 15.938179, 3.000000, -1.679268, 0.520177, 0.645820, -0.558867, +1.336982, 12.495934, 16.355419, 2.500000, -1.679268, 0.999037, -0.033131, 0.028753, +1.336982, 12.495934, 16.355419, 2.500000, -1.679268, 0.999037, -0.033131, 0.028753, +1.002737, 12.090717, 16.772659, 2.000000, -1.679268, 0.484165, -0.653669, 0.581636, +1.002737, 10.760361, 14.994465, 2.000000, -1.516370, 0.490912, -0.740187, 0.459488, +1.002737, 13.576080, 18.160946, 2.000000, -1.834628, 0.481336, -0.535363, 0.694048, +1.002737, 12.090717, 16.772659, 2.000000, -1.679268, 0.484165, -0.653669, 0.581636, +1.336982, 12.495934, 16.355419, 2.500000, -1.679268, 0.999037, -0.033131, 0.028753, +1.336982, 12.495934, 16.355419, 2.500000, -1.679268, 0.999037, -0.033131, 0.028753, +1.002737, 12.901150, 15.938179, 3.000000, -1.679268, 0.520177, 0.645820, -0.558867, +1.002737, 14.227100, 17.202572, 3.000000, -1.834628, 0.519663, 0.527798, -0.671848, +1.002737, 14.227100, 17.202572, 3.000000, -1.834628, 0.519663, 0.527798, -0.671848, +1.002737, 15.688553, 18.126600, 3.000000, -1.988039, 0.519424, 0.384311, -0.763219, +1.336982, 15.450417, 18.654261, 2.500000, -1.988039, 0.998886, -0.021467, 0.042031, +1.336982, 15.450417, 18.654261, 2.500000, -1.988039, 0.998886, -0.021467, 0.042031, +1.002737, 15.212280, 19.181923, 2.000000, -1.988039, 0.480828, -0.389724, 0.785442, +1.002737, 13.576080, 18.160946, 2.000000, -1.834628, 0.481336, -0.535363, 0.694048, +1.002737, 16.995155, 19.858189, 2.000000, -2.145087, 0.479530, -0.225145, 0.848151, +1.002737, 15.212280, 19.181923, 2.000000, -1.988039, 0.480828, -0.389724, 0.785442, +1.336982, 15.450417, 18.654261, 2.500000, -1.988039, 0.998886, -0.021467, 0.042031, +1.336982, 15.450417, 18.654261, 2.500000, -1.988039, 0.998886, -0.021467, 0.042031, +1.002737, 15.688553, 18.126600, 3.000000, -1.988039, 0.519424, 0.384311, -0.763219, +1.002737, 17.277420, 18.737804, 3.000000, -2.145087, 0.519855, 0.222506, -0.824768, +1.002737, 17.277420, 18.737804, 3.000000, -2.145087, 0.519855, 0.222506, -0.824768, +1.002737, 18.963112, 19.009758, 3.000000, -2.305904, 0.519106, 0.044200, -0.853567, +1.336982, 18.926823, 19.584188, 2.500000, -2.305904, 0.998704, -0.001978, 0.050856, +1.336982, 18.926823, 19.584188, 2.500000, -2.305904, 0.998704, -0.001978, 0.050856, +1.002737, 18.890533, 20.158619, 2.000000, -2.305904, 0.477686, -0.044014, 0.877427, +1.002737, 16.995155, 19.858189, 2.000000, -2.145087, 0.479530, -0.225145, 0.848151, +1.002737, 20.864250, 20.052088, 2.000000, -2.470621, 0.474231, 0.150976, 0.867359, +1.002737, 18.890533, 20.158619, 2.000000, -2.305904, 0.477686, -0.044014, 0.877427, +1.336982, 18.926823, 19.584188, 2.500000, -2.305904, 0.998704, -0.001978, 0.050856, +1.336982, 18.926823, 19.584188, 2.500000, -2.305904, 0.998704, -0.001978, 0.050856, +1.002737, 18.963112, 19.009758, 3.000000, -2.305904, 0.519106, 0.044200, -0.853567, +1.002737, 20.715042, 18.916035, 3.000000, -2.470621, 0.518180, -0.147145, -0.842519, +1.002737, 20.715042, 18.916035, 3.000000, -2.470621, 0.518180, -0.147145, -0.842519, +1.002737, 22.528091, 18.387989, 3.000000, -2.646001, 0.514483, -0.334572, -0.789537, +1.336982, 22.719658, 18.922981, 2.500000, -2.646001, 0.998523, 0.022591, 0.049420, +1.336982, 22.719658, 18.922981, 2.500000, -2.646001, 0.998523, 0.022591, 0.049420, +1.002737, 22.911228, 19.457972, 2.000000, -2.646001, 0.471248, 0.342725, 0.812690, +1.002737, 20.864250, 20.052088, 2.000000, -2.470621, 0.474231, 0.150976, 0.867359, +1.002737, 25.026405, 18.295650, 2.000000, -2.838810, 0.470077, 0.507995, 0.721781, +1.002737, 22.911228, 19.457972, 2.000000, -2.646001, 0.471248, 0.342725, 0.812690, +1.336982, 22.719658, 18.922981, 2.500000, -2.646001, 0.998523, 0.022591, 0.049420, +1.336982, 22.719658, 18.922981, 2.500000, -2.646001, 0.998523, 0.022591, 0.049420, +1.002737, 22.528091, 18.387989, 3.000000, -2.646001, 0.514483, -0.334572, -0.789537, +1.002737, 24.397125, 17.356983, 3.000000, -2.838810, 0.512162, -0.495528, -0.701529, +1.002737, 24.397125, 17.356983, 3.000000, -2.838810, 0.512162, -0.495528, -0.701529, +1.002737, 26.120163, 15.851318, 3.000000, -3.038383, 0.515999, -0.637877, -0.571716, +1.336982, 26.551086, 16.221825, 2.500000, -3.038383, 0.998387, 0.041476, 0.038776, +1.336982, 26.551086, 16.221825, 2.500000, -3.038383, 0.998387, 0.041476, 0.038776, +1.002737, 26.982021, 16.592329, 2.000000, -3.038383, 0.470672, 0.656258, 0.589740, +1.002737, 25.026405, 18.295650, 2.000000, -2.838810, 0.470077, 0.507995, 0.721781, +1.002737, 28.550339, 14.375221, 2.000000, -3.234054, 0.475606, 0.784875, 0.397204, +1.002737, 26.982021, 16.592329, 2.000000, -3.038383, 0.470672, 0.656258, 0.589740, +1.336982, 26.551086, 16.221825, 2.500000, -3.038383, 0.998387, 0.041476, 0.038776, +1.336982, 26.551086, 16.221825, 2.500000, -3.038383, 0.998387, 0.041476, 0.038776, +1.002737, 26.120163, 15.851318, 3.000000, -3.038383, 0.515999, -0.637877, -0.571716, +1.002737, 27.495193, 13.899298, 3.000000, -3.234054, 0.529173, -0.759785, -0.377761, +1.002737, 27.495193, 13.899298, 3.000000, -3.234054, 0.529173, -0.759785, -0.377761, +1.002737, 28.234837, 11.594270, 3.000000, -3.421010, 0.549862, -0.829858, -0.094800, +1.336982, 28.829941, 11.681159, 2.500000, -3.421010, 0.997287, 0.072725, 0.011376, +1.336982, 28.829941, 11.681159, 2.500000, -3.421010, 0.997287, 0.072725, 0.011376, +1.002737, 29.425041, 11.768046, 2.000000, -3.421010, 0.486093, 0.865826, 0.118573, +1.002737, 28.550339, 14.375221, 2.000000, -3.234054, 0.475606, 0.784875, 0.397204, +1.002737, 29.299828, 8.894522, 2.000000, -3.594440, 0.508084, 0.850362, -0.136877, +1.002737, 29.425041, 11.768046, 2.000000, -3.421010, 0.486093, 0.865826, 0.118573, +1.336982, 28.829941, 11.681159, 2.500000, -3.421010, 0.997287, 0.072725, 0.011376, +1.336982, 28.829941, 11.681159, 2.500000, -3.421010, 0.997287, 0.072725, 0.011376, +1.002737, 28.234837, 11.594270, 3.000000, -3.421010, 0.549862, -0.829858, -0.094800, +1.002737, 28.051701, 9.029581, 3.000000, -3.594440, 0.552395, -0.818570, 0.157487, +1.002737, 28.051701, 9.029581, 3.000000, -3.594440, 0.552395, -0.818570, 0.157487, +1.002737, 27.272324, 6.583387, 3.000000, -3.741287, 0.563171, -0.762895, 0.317537, +1.336982, 27.897228, 6.377859, 2.500000, -3.741288, 0.999306, 0.035287, -0.011950, +1.336982, 27.897228, 6.377859, 2.500000, -3.741288, 0.999306, 0.035287, -0.011950, +1.002737, 28.522129, 6.172330, 2.000000, -3.741287, 0.527923, 0.793569, -0.302564, +1.002737, 29.299828, 8.894522, 2.000000, -3.594440, 0.508084, 0.850362, -0.136877, +1.002737, 27.439377, 4.019153, 2.000000, -3.848496, 0.545786, 0.725589, -0.419091, +1.002737, 28.522129, 6.172330, 2.000000, -3.741287, 0.527923, 0.793569, -0.302564, +1.336982, 27.897228, 6.377859, 2.500000, -3.741288, 0.999306, 0.035287, -0.011950, +1.336982, 27.897228, 6.377859, 2.500000, -3.741288, 0.999306, 0.035287, -0.011950, +1.002737, 27.272324, 6.583387, 3.000000, -3.741287, 0.563171, -0.762895, 0.317537, +1.002737, 26.223228, 4.633848, 3.000000, -3.848496, 0.571231, -0.699649, 0.429169, +1.002737, 26.223228, 4.633848, 3.000000, -3.848496, 0.571231, -0.699649, 0.429169, +1.002737, 25.192875, 3.192066, 3.000000, -3.922053, 0.573805, -0.657830, 0.487860, +1.336982, 25.778152, 2.814326, 2.500000, -3.922053, 0.999924, 0.011227, -0.005182, +1.336982, 25.778152, 2.814326, 2.500000, -3.922053, 0.999924, 0.011227, -0.005182, +1.002737, 26.363422, 2.436586, 2.000000, -3.922053, 0.561369, 0.675750, -0.477732, +1.002737, 27.439377, 4.019153, 2.000000, -3.848496, 0.545786, 0.725589, -0.419091, +1.002737, 24.600067, 1.327282, 2.500000, -4.000000, 0.595697, -0.491752, -0.635079, +0.742768, 25.130249, 1.141007, 2.000000, -4.000000, 0.424007, 0.088516, -0.901323, +1.002737, 25.606094, 1.426226, 2.000000, -3.967943, 0.572183, 0.564519, -0.594916, +1.002737, 25.606094, 1.426226, 2.000000, -3.967943, 0.572183, 0.564519, -0.594916, +1.002737, 26.363422, 2.436586, 2.000000, -3.922053, 0.561369, 0.675750, -0.477732, +1.336982, 25.778152, 2.814326, 2.500000, -3.922053, 0.999924, 0.011227, -0.005182, +1.336982, 25.778152, 2.814326, 2.500000, -3.922053, 0.999924, 0.011227, -0.005182, +1.002737, 25.192875, 3.192066, 3.000000, -3.922053, 0.573805, -0.657830, 0.487860, +1.002737, 24.469711, 2.269146, 3.000000, -3.967943, 0.583534, -0.710408, 0.393458, +1.002737, 24.469711, 2.269146, 3.000000, -3.967943, 0.583534, -0.710408, 0.393458, +0.742768, 24.296909, 1.783397, 3.000000, -4.000000, 0.428917, -0.894621, -0.125234, +1.002737, 24.600067, 1.327282, 2.500000, -4.000000, 0.595697, -0.491752, -0.635079, +-1.002737, 4.921762, -29.530731, 4.000000, 0.966243, -0.582241, 0.811733, -0.045666, +-1.002737, 4.997122, -28.191074, 4.000000, 0.932486, -0.582174, 0.810005, -0.070467, +0.000000, 5.231688, -28.210423, 3.500000, 0.922656, 0.000000, 0.996270, -0.086288, +0.000000, 5.231688, -28.210423, 3.500000, 0.922656, 0.000000, 0.996270, -0.086288, +1.002737, 4.997122, -28.191074, 3.000000, 0.922656, 0.582175, 0.810004, -0.070467, +1.002737, 4.921762, -29.530731, 3.000000, 0.966243, 0.582240, 0.811733, -0.045667, +1.002737, 5.199909, -26.333269, 3.000000, 0.859409, 0.582690, 0.803052, -0.124820, +1.002737, 4.997122, -28.191074, 3.000000, 0.922656, 0.582175, 0.810004, -0.070467, +0.000000, 5.231688, -28.210423, 3.500000, 0.922656, 0.000000, 0.996270, -0.086288, +0.000000, 5.231688, -28.210423, 3.500000, 0.922656, 0.000000, 0.996270, -0.086288, +-1.002737, 4.997122, -28.191074, 4.000000, 0.932486, -0.582174, 0.810005, -0.070467, +-1.002737, 5.199909, -26.333269, 4.000000, 0.859409, -0.582690, 0.803052, -0.124820, +-1.002737, 5.199909, -26.333269, 4.000000, 0.859409, -0.582690, 0.803052, -0.124820, +-1.002737, 5.640600, -24.050657, 4.000000, 0.786333, -0.583127, 0.787897, -0.197941, +0.000000, 5.870369, -24.095905, 3.500000, 0.775297, 0.000000, 0.969755, -0.244081, +0.000000, 5.870369, -24.095905, 3.500000, 0.775297, 0.000000, 0.969755, -0.244081, +1.002737, 5.640600, -24.050657, 3.000000, 0.775297, 0.583127, 0.787897, -0.197941, +1.002737, 5.199909, -26.333269, 3.000000, 0.859409, 0.582690, 0.803052, -0.124820, +1.002737, 6.429670, -21.436577, 3.000000, 0.669113, 0.579786, 0.770207, -0.265761, +1.002737, 5.640600, -24.050657, 3.000000, 0.775297, 0.583127, 0.787897, -0.197941, +0.000000, 5.870369, -24.095905, 3.500000, 0.775297, 0.000000, 0.969755, -0.244081, +0.000000, 5.870369, -24.095905, 3.500000, 0.775297, 0.000000, 0.969755, -0.244081, +-1.002737, 5.640600, -24.050657, 4.000000, 0.786333, -0.583127, 0.787897, -0.197941, +-1.002737, 6.429670, -21.436577, 4.000000, 0.669113, -0.579786, 0.770207, -0.265761, +-1.002737, 6.429670, -21.436577, 4.000000, 0.669113, -0.579786, 0.770207, -0.265761, +-1.002737, 7.484703, -18.704168, 4.000000, 0.551894, -0.576888, 0.751118, -0.320970, +0.000000, 7.711994, -18.765621, 3.500000, 0.547971, -0.000000, 0.919277, -0.393611, +0.000000, 7.711994, -18.765621, 3.500000, 0.547971, -0.000000, 0.919277, -0.393611, +1.002737, 7.484703, -18.704170, 3.000000, 0.547971, 0.576888, 0.751119, -0.320970, +1.002737, 6.429670, -21.436577, 3.000000, 0.669113, 0.579786, 0.770207, -0.265761, +1.002737, 8.723274, -16.066572, 3.000000, 0.418984, 0.570576, 0.739144, -0.357922, +1.002737, 7.484703, -18.704170, 3.000000, 0.547971, 0.576888, 0.751119, -0.320970, +0.000000, 7.711994, -18.765621, 3.500000, 0.547971, -0.000000, 0.919277, -0.393611, +0.000000, 7.711994, -18.765621, 3.500000, 0.547971, -0.000000, 0.919277, -0.393611, +-1.002737, 7.484703, -18.704168, 4.000000, 0.551894, -0.576888, 0.751118, -0.320970, +-1.002737, 8.723274, -16.066572, 4.000000, 0.418984, -0.570577, 0.739144, -0.357922, +-1.002737, 8.723274, -16.066572, 4.000000, 0.418984, -0.570577, 0.739144, -0.357922, +-1.002737, 10.001389, -13.505806, 4.000000, 0.286075, -0.565597, 0.742253, -0.359389, +0.000000, 10.230309, -13.563657, 3.500000, 0.282904, -0.000000, 0.900257, -0.435359, +0.000000, 10.230309, -13.563657, 3.500000, 0.282904, -0.000000, 0.900257, -0.435359, +1.002737, 10.001389, -13.505806, 3.000000, 0.282904, 0.565597, 0.742254, -0.359389, +1.002737, 8.723274, -16.066572, 3.000000, 0.418984, 0.570576, 0.739144, -0.357922, +1.002737, 11.175043, -11.003893, 3.000000, 0.140482, 0.562569, 0.757951, -0.330192, +1.002737, 10.001389, -13.505806, 3.000000, 0.282904, 0.565597, 0.742254, -0.359389, +0.000000, 10.230309, -13.563657, 3.500000, 0.282904, -0.000000, 0.900257, -0.435359, +0.000000, 10.230309, -13.563657, 3.500000, 0.282904, -0.000000, 0.900257, -0.435359, +-1.002737, 10.001389, -13.505806, 4.000000, 0.286075, -0.565597, 0.742253, -0.359389, +-1.002737, 11.175043, -11.003893, 4.000000, 0.140482, -0.562513, 0.757929, -0.330337, +-1.002737, 11.175043, -11.003893, 4.000000, 0.140482, -0.562513, 0.757929, -0.330337, +-1.003346, 12.054029, -8.797724, 4.000000, -0.005111, -0.560047, 0.787144, -0.258362, +-0.000610, 12.286734, -8.840019, 3.333333, -0.069211, 0.000044, 0.950614, -0.310377, +-0.000610, 12.286734, -8.840019, 3.333333, -0.069211, 0.000044, 0.950614, -0.310377, +1.002127, 12.054029, -8.797724, 2.958333, -0.009381, 0.560195, 0.787255, -0.257702, +1.002737, 11.175043, -11.003893, 3.000000, 0.140482, 0.562569, 0.757951, -0.330192, +1.000299, 12.448139, -7.124194, 2.833333, -0.167786, 0.564659, 0.816023, -0.123558, +1.002127, 12.054029, -8.797724, 2.958333, -0.009381, 0.560195, 0.787255, -0.257702, +-0.000610, 12.286734, -8.840019, 3.333333, -0.069211, 0.000044, 0.950614, -0.310377, +-0.000610, 12.286734, -8.840019, 3.333333, -0.069211, 0.000044, 0.950614, -0.310377, +-1.003346, 12.054029, -8.797724, 4.000000, -0.005111, -0.560047, 0.787144, -0.258362, +-1.005175, 12.448139, -7.124194, 2.666667, -0.726194, -0.564732, 0.815815, -0.124590, +-1.005175, 12.448139, -7.124194, 2.666667, -0.726194, -0.564732, 0.815815, -0.124590, +-1.006394, 12.522362, -5.716876, 1.333333, -1.447277, -0.566040, 0.824377, 0.001632, +-0.003657, 12.756954, -5.750165, 2.166667, -0.809096, -0.000126, 1.000000, 0.000870, +-0.003657, 12.756954, -5.750165, 2.166667, -0.809096, -0.000126, 1.000000, 0.000870, +0.999079, 12.522362, -5.716876, 3.000000, -0.170915, 0.565733, 0.824587, 0.001687, +1.000299, 12.448139, -7.124194, 2.833333, -0.167786, 0.564659, 0.816023, -0.123558, +1.002737, 11.560024, -0.158328, 3.000000, -0.503387, 0.548192, 0.812432, 0.198592, +1.002127, 12.142200, -2.567771, 3.000000, -0.336720, 0.545588, 0.819894, 0.173516, +-0.000610, 12.377636, -2.594154, 3.500000, -0.336720, 0.000041, 0.978486, 0.206311, +-0.000610, 12.377636, -2.594154, 3.500000, -0.336720, 0.000041, 0.978486, 0.206311, +-1.003346, 12.142200, -2.567771, 4.000000, -0.336720, -0.545383, 0.819886, 0.174196, +-1.002737, 11.560024, -0.158328, 4.000000, -0.503387, -0.548128, 0.812439, 0.198744, +-1.002737, 11.560024, -0.158328, 4.000000, -0.503387, -0.548128, 0.812439, 0.198744, +-1.002737, 10.886791, 2.566613, 4.000000, -0.670054, -0.549613, 0.814083, 0.187601, +0.000000, 11.117409, 2.540119, 3.500000, -0.671927, 0.000000, 0.974103, 0.226104, +0.000000, 11.117409, 2.540119, 3.500000, -0.671927, 0.000000, 0.974103, 0.226104, +1.002737, 10.886791, 2.566613, 3.000000, -0.671927, 0.549613, 0.814083, 0.187601, +1.002737, 11.560024, -0.158328, 3.000000, -0.503387, 0.548192, 0.812432, 0.198592, +1.002737, 10.314148, 5.254678, 3.000000, -0.844213, 0.550065, 0.824042, 0.135587, +1.002737, 10.886791, 2.566613, 3.000000, -0.671927, 0.549613, 0.814083, 0.187601, +0.000000, 11.117409, 2.540119, 3.500000, -0.671927, 0.000000, 0.974103, 0.226104, +0.000000, 11.117409, 2.540119, 3.500000, -0.671927, 0.000000, 0.974103, 0.226104, +-1.002737, 10.886791, 2.566613, 4.000000, -0.670054, -0.549613, 0.814083, 0.187601, +-1.002737, 10.314148, 5.254678, 4.000000, -0.844213, -0.550065, 0.824042, 0.135588, +-1.002737, 10.314148, 5.254678, 4.000000, -0.844213, -0.550065, 0.824042, 0.135588, +-1.002737, 10.024443, 7.827566, 4.000000, -1.018373, -0.552727, 0.833125, 0.019881, +0.000000, 10.237921, 7.780712, 3.500000, -1.016250, -0.000000, 0.999593, 0.028523, +0.000000, 10.237921, 7.780712, 3.500000, -1.016250, -0.000000, 0.999593, 0.028523, +1.002737, 10.024445, 7.827566, 3.000000, -1.016250, 0.552727, 0.833125, 0.019881, +1.002737, 10.314148, 5.254678, 3.000000, -0.844213, 0.550065, 0.824042, 0.135587, +1.002737, 10.200031, 10.206976, 3.000000, -1.184038, 0.545898, 0.826469, -0.137636, +1.002737, 10.024445, 7.827566, 3.000000, -1.016250, 0.552727, 0.833125, 0.019881, +0.000000, 10.237921, 7.780712, 3.500000, -1.016250, -0.000000, 0.999593, 0.028523, +0.000000, 10.237921, 7.780712, 3.500000, -1.016250, -0.000000, 0.999593, 0.028523, +-1.002737, 10.024443, 7.827566, 4.000000, -1.018373, -0.552727, 0.833125, 0.019881, +-1.002737, 10.200031, 10.206976, 4.000000, -1.184038, -0.545898, 0.826469, -0.137636, +-1.002737, 10.200031, 10.206976, 4.000000, -1.184038, -0.545898, 0.826469, -0.137636, +-1.002737, 10.783842, 12.373039, 4.000000, -1.349704, -0.535040, 0.792292, -0.293266, +0.000000, 10.965359, 12.283498, 3.500000, -1.349954, -0.000000, 0.938935, -0.344095, +0.000000, 10.965359, 12.283498, 3.500000, -1.349954, -0.000000, 0.938935, -0.344095, +1.002737, 10.783842, 12.373039, 3.000000, -1.349954, 0.535040, 0.792292, -0.293267, +1.002737, 10.200031, 10.206976, 3.000000, -1.184038, 0.545898, 0.826469, -0.137636, +1.002737, 11.718807, 14.305887, 3.000000, -1.516370, 0.524951, 0.731928, -0.434405, +1.002737, 10.783842, 12.373039, 3.000000, -1.349954, 0.535040, 0.792292, -0.293267, +0.000000, 10.965359, 12.283498, 3.500000, -1.349954, -0.000000, 0.938935, -0.344095, +0.000000, 10.965359, 12.283498, 3.500000, -1.349954, -0.000000, 0.938935, -0.344095, +-1.002737, 10.783842, 12.373039, 4.000000, -1.349704, -0.535040, 0.792292, -0.293266, +-1.002737, 11.718807, 14.305887, 4.000000, -1.516370, -0.524951, 0.731928, -0.434405, +-1.002737, 11.718807, 14.305887, 4.000000, -1.516370, -0.524951, 0.731928, -0.434405, +-1.002737, 12.901150, 15.938179, 4.000000, -1.683037, -0.520176, 0.645820, -0.558867, +0.000000, 13.036221, 15.799099, 3.500000, -1.679268, 0.000000, 0.757369, -0.652987, +0.000000, 13.036221, 15.799099, 3.500000, -1.679268, 0.000000, 0.757369, -0.652987, +1.002737, 12.901150, 15.938179, 3.000000, -1.679268, 0.520177, 0.645820, -0.558867, +1.002737, 11.718807, 14.305887, 3.000000, -1.516370, 0.524951, 0.731928, -0.434405, +1.002737, 14.227100, 17.202572, 3.000000, -1.834628, 0.519663, 0.527798, -0.671848, +1.002737, 12.901150, 15.938179, 3.000000, -1.679268, 0.520177, 0.645820, -0.558867, +0.000000, 13.036221, 15.799099, 3.500000, -1.679268, 0.000000, 0.757369, -0.652987, +0.000000, 13.036221, 15.799099, 3.500000, -1.679268, 0.000000, 0.757369, -0.652987, +-1.002737, 12.901150, 15.938179, 4.000000, -1.683037, -0.520176, 0.645820, -0.558867, +-1.002737, 14.227100, 17.202572, 4.000000, -1.834628, -0.519663, 0.527798, -0.671848, +-1.002737, 14.227100, 17.202572, 4.000000, -1.834628, -0.519663, 0.527798, -0.671848, +-1.002737, 15.688553, 18.126600, 4.000000, -1.986219, -0.519424, 0.384311, -0.763219, +0.000000, 15.767933, 17.950714, 3.500000, -1.988039, 0.000000, 0.450479, -0.892787, +0.000000, 15.767933, 17.950714, 3.500000, -1.988039, 0.000000, 0.450479, -0.892787, +1.002737, 15.688553, 18.126600, 3.000000, -1.988039, 0.519424, 0.384311, -0.763219, +1.002737, 14.227100, 17.202572, 3.000000, -1.834628, 0.519663, 0.527798, -0.671848, +1.002737, 17.277420, 18.737804, 3.000000, -2.145087, 0.519855, 0.222506, -0.824768, +1.002737, 15.688553, 18.126600, 3.000000, -1.988039, 0.519424, 0.384311, -0.763219, +0.000000, 15.767933, 17.950714, 3.500000, -1.988039, 0.000000, 0.450479, -0.892787, +0.000000, 15.767933, 17.950714, 3.500000, -1.988039, 0.000000, 0.450479, -0.892787, +-1.002737, 15.688553, 18.126600, 4.000000, -1.986219, -0.519424, 0.384311, -0.763219, +-1.002737, 17.277420, 18.737804, 4.000000, -2.145087, -0.519855, 0.222506, -0.824768, +-1.002737, 17.277420, 18.737804, 4.000000, -2.145087, -0.519855, 0.222506, -0.824768, +-1.002737, 18.963112, 19.009758, 4.000000, -2.303954, -0.519106, 0.044200, -0.853567, +0.000000, 18.975204, 18.818281, 3.500000, -2.305904, -0.000000, 0.051821, -0.998656, +0.000000, 18.975204, 18.818281, 3.500000, -2.305904, -0.000000, 0.051821, -0.998656, +1.002737, 18.963112, 19.009758, 3.000000, -2.305904, 0.519106, 0.044200, -0.853567, +1.002737, 17.277420, 18.737804, 3.000000, -2.145087, 0.519855, 0.222506, -0.824768, +1.002737, 20.715042, 18.916035, 3.000000, -2.470621, 0.518180, -0.147145, -0.842519, +1.002737, 18.963112, 19.009758, 3.000000, -2.305904, 0.519106, 0.044200, -0.853567, +0.000000, 18.975204, 18.818281, 3.500000, -2.305904, -0.000000, 0.051821, -0.998656, +0.000000, 18.975204, 18.818281, 3.500000, -2.305904, -0.000000, 0.051821, -0.998656, +-1.002737, 18.963112, 19.009758, 4.000000, -2.303954, -0.519106, 0.044200, -0.853567, +-1.002737, 20.715042, 18.916035, 4.000000, -2.470621, -0.518180, -0.147145, -0.842519, +-1.002737, 20.715042, 18.916035, 4.000000, -2.470621, -0.518180, -0.147145, -0.842519, +-1.002737, 22.528088, 18.387989, 4.000000, -2.637287, -0.514483, -0.334572, -0.789537, +0.000000, 22.464233, 18.209660, 3.500000, -2.646001, -0.000000, -0.390600, -0.920561, +0.000000, 22.464233, 18.209660, 3.500000, -2.646001, -0.000000, -0.390600, -0.920561, +1.002737, 22.528091, 18.387989, 3.000000, -2.646001, 0.514483, -0.334572, -0.789537, +1.002737, 20.715042, 18.916035, 3.000000, -2.470621, 0.518180, -0.147145, -0.842519, +1.002737, 24.397125, 17.356983, 3.000000, -2.838810, 0.512162, -0.495528, -0.701529, +1.002737, 22.528091, 18.387989, 3.000000, -2.646001, 0.514483, -0.334572, -0.789537, +0.000000, 22.464233, 18.209660, 3.500000, -2.646001, -0.000000, -0.390600, -0.920561, +0.000000, 22.464233, 18.209660, 3.500000, -2.646001, -0.000000, -0.390600, -0.920561, +-1.002737, 22.528088, 18.387989, 4.000000, -2.637287, -0.514483, -0.334572, -0.789537, +-1.002737, 24.397125, 17.356983, 4.000000, -2.838810, -0.512162, -0.495528, -0.701529, +-1.002737, 24.397125, 17.356983, 4.000000, -2.838810, -0.512162, -0.495528, -0.701529, +-1.002737, 26.120163, 15.851318, 4.000000, -3.040334, -0.515999, -0.637877, -0.571716, +0.000000, 25.976517, 15.727814, 3.500000, -3.038383, -0.000000, -0.744667, -0.667436, +0.000000, 25.976517, 15.727814, 3.500000, -3.038383, -0.000000, -0.744667, -0.667436, +1.002737, 26.120163, 15.851318, 3.000000, -3.038383, 0.515999, -0.637877, -0.571716, +1.002737, 24.397125, 17.356983, 3.000000, -2.838810, 0.512162, -0.495528, -0.701529, +1.002737, 27.495193, 13.899298, 3.000000, -3.234054, 0.529173, -0.759785, -0.377761, +1.002737, 26.120163, 15.851318, 3.000000, -3.038383, 0.515999, -0.637877, -0.571716, +0.000000, 25.976517, 15.727814, 3.500000, -3.038383, -0.000000, -0.744667, -0.667436, +0.000000, 25.976517, 15.727814, 3.500000, -3.038383, -0.000000, -0.744667, -0.667436, +-1.002737, 26.120163, 15.851318, 4.000000, -3.040334, -0.515999, -0.637877, -0.571716, +-1.002737, 27.495193, 13.899298, 4.000000, -3.234054, -0.529173, -0.759785, -0.377761, +-1.002737, 27.495193, 13.899298, 4.000000, -3.234054, -0.529173, -0.759785, -0.377761, +-1.002737, 28.234837, 11.594271, 4.000000, -3.427773, -0.549861, -0.829859, -0.094800, +0.000000, 28.036469, 11.565307, 3.500000, -3.421010, -0.000000, -0.993846, -0.110776, +0.000000, 28.036469, 11.565307, 3.500000, -3.421010, -0.000000, -0.993846, -0.110776, +1.002737, 28.234837, 11.594270, 3.000000, -3.421010, 0.549862, -0.829858, -0.094800, +1.002737, 27.495193, 13.899298, 3.000000, -3.234054, 0.529173, -0.759785, -0.377761, +1.002737, 28.051701, 9.029581, 3.000000, -3.594440, 0.552395, -0.818570, 0.157487, +1.002737, 28.234837, 11.594270, 3.000000, -3.421010, 0.549862, -0.829858, -0.094800, +0.000000, 28.036469, 11.565307, 3.500000, -3.421010, -0.000000, -0.993846, -0.110776, +0.000000, 28.036469, 11.565307, 3.500000, -3.421010, -0.000000, -0.993846, -0.110776, +-1.002737, 28.234837, 11.594271, 4.000000, -3.427773, -0.549861, -0.829859, -0.094800, +-1.002737, 28.051701, 9.029581, 4.000000, -3.594440, -0.552394, -0.818572, 0.157487, +-1.002737, 28.051701, 9.029581, 4.000000, -3.594440, -0.552394, -0.818572, 0.157487, +-1.002737, 27.272324, 6.583387, 4.000000, -3.761107, -0.563170, -0.762896, 0.317537, +0.000000, 27.064018, 6.651896, 3.500000, -3.741288, 0.000000, -0.921832, 0.387591, +0.000000, 27.064018, 6.651896, 3.500000, -3.741288, 0.000000, -0.921832, 0.387591, +1.002737, 27.272324, 6.583387, 3.000000, -3.741287, 0.563171, -0.762895, 0.317537, +1.002737, 28.051701, 9.029581, 3.000000, -3.594440, 0.552395, -0.818570, 0.157487, +1.002737, 26.223228, 4.633848, 3.000000, -3.848496, 0.571231, -0.699649, 0.429169, +1.002737, 27.272324, 6.583387, 3.000000, -3.741287, 0.563171, -0.762895, 0.317537, +0.000000, 27.064018, 6.651896, 3.500000, -3.741288, 0.000000, -0.921832, 0.387591, +0.000000, 27.064018, 6.651896, 3.500000, -3.741288, 0.000000, -0.921832, 0.387591, +-1.002737, 27.272324, 6.583387, 4.000000, -3.761107, -0.563170, -0.762896, 0.317537, +-1.002737, 26.223228, 4.633848, 4.000000, -3.848496, -0.571231, -0.699650, 0.429169, +-1.002737, 26.223228, 4.633848, 4.000000, -3.848496, -0.571231, -0.699650, 0.429169, +-1.002737, 25.192875, 3.192066, 4.000000, -3.935886, -0.573805, -0.657830, 0.487860, +0.000000, 24.997784, 3.317980, 3.500000, -3.922053, -0.000000, -0.801896, 0.597463, +0.000000, 24.997784, 3.317980, 3.500000, -3.922053, -0.000000, -0.801896, 0.597463, +1.002737, 25.192875, 3.192066, 3.000000, -3.922053, 0.573805, -0.657830, 0.487860, +1.002737, 26.223228, 4.633848, 3.000000, -3.848496, 0.571231, -0.699649, 0.429169, +0.000000, 24.041351, 1.768998, 3.500000, -4.000000, 0.000000, -0.991299, -0.131630, +0.742768, 24.296909, 1.783397, 3.000000, -4.000000, 0.428917, -0.894621, -0.125234, +1.002737, 24.469711, 2.269146, 3.000000, -3.967943, 0.583534, -0.710408, 0.393458, +1.002737, 24.469711, 2.269146, 3.000000, -3.967943, 0.583534, -0.710408, 0.393458, +1.002737, 25.192875, 3.192066, 3.000000, -3.922053, 0.573805, -0.657830, 0.487860, +0.000000, 24.997784, 3.317980, 3.500000, -3.922053, -0.000000, -0.801896, 0.597463, +0.000000, 24.997784, 3.317980, 3.500000, -3.922053, -0.000000, -0.801896, 0.597463, +-1.002737, 25.192875, 3.192066, 4.000000, -3.935886, -0.573805, -0.657830, 0.487860, +-1.002737, 24.469711, 2.269146, 4.000000, -3.967943, -0.583534, -0.710408, 0.393458, +-1.002737, 24.469711, 2.269146, 4.000000, -3.967943, -0.583534, -0.710408, 0.393458, +-0.742768, 24.296909, 1.783397, 4.000000, -4.000000, -0.428917, -0.894621, -0.125234, +0.000000, 24.041351, 1.768998, 3.500000, -4.000000, 0.000000, -0.991299, -0.131630, +-1.002737, -1.292564, -32.294178, 1.000000, 0.972854, -0.576236, -0.817066, 0.018853, +-1.002737, -1.259859, -30.876823, 1.000000, 0.937170, -0.573164, -0.818796, 0.032517, +-1.336982, -0.552929, -30.921089, 0.500000, 0.937170, -0.999978, -0.006540, 0.000687, +-1.336982, -0.552929, -30.921089, 0.500000, 0.937170, -0.999978, -0.006540, 0.000687, +-1.002737, 0.153999, -30.965355, 0.000000, 0.945709, -0.580105, 0.814042, -0.028521, +-1.002737, 0.129889, -32.334755, 0.000000, 0.972854, -0.578352, 0.815661, -0.014359, +-1.002737, 0.245815, -29.027195, 0.000000, 0.884407, -0.580554, 0.811733, -0.063605, +-1.002737, 0.153999, -30.965355, 0.000000, 0.945709, -0.580105, 0.814042, -0.028521, +-1.336982, -0.552929, -30.921089, 0.500000, 0.937170, -0.999978, -0.006540, 0.000687, +-1.336982, -0.552929, -30.921089, 0.500000, 0.937170, -0.999978, -0.006540, 0.000687, +-1.002737, -1.259859, -30.876823, 1.000000, 0.937170, -0.573164, -0.818796, 0.032517, +-1.002737, -1.156864, -28.875961, 1.000000, 0.884407, -0.570246, -0.818776, 0.066533, +-1.002737, -1.156864, -28.875961, 1.000000, 0.884407, -0.570246, -0.818776, 0.066533, +-1.002737, -0.895025, -26.385366, 1.000000, 0.812277, -0.568649, -0.814249, 0.116778, +-1.336982, -0.199492, -26.493555, 0.500000, 0.812277, -0.999928, -0.011914, 0.001651, +-1.336982, -0.199492, -26.493555, 0.500000, 0.812277, -0.999928, -0.011914, 0.001651, +-1.002737, 0.496042, -26.601746, 0.000000, 0.823105, -0.581048, 0.805721, -0.114877, +-1.002737, 0.245815, -29.027195, 0.000000, 0.884407, -0.580554, 0.811733, -0.063605, +-1.002737, 0.995396, -23.770485, 0.000000, 0.718491, -0.583417, 0.789634, -0.190008, +-1.002737, 0.496042, -26.601746, 0.000000, 0.823105, -0.581048, 0.805721, -0.114877, +-1.336982, -0.199492, -26.493555, 0.500000, 0.812277, -0.999928, -0.011914, 0.001651, +-1.336982, -0.199492, -26.493555, 0.500000, 0.812277, -0.999928, -0.011914, 0.001651, +-1.002737, -0.895025, -26.385366, 1.000000, 0.812277, -0.568649, -0.814249, 0.116778, +-1.002737, -0.385786, -23.498796, 1.000000, 0.718491, -0.565019, -0.802220, 0.192863, +-1.002737, -0.385786, -23.498796, 1.000000, 0.718491, -0.565019, -0.802220, 0.192863, +-1.000716, 0.522999, -20.483551, 1.046875, 0.600702, -0.555184, -0.771596, 0.310500, +-1.334961, 1.211163, -20.628946, 0.687500, 0.612715, -0.999676, -0.020934, 0.014474, +-1.334961, 1.211163, -20.628946, 0.687500, 0.612715, -0.999676, -0.020934, 0.014474, +-1.000716, 1.899328, -20.774343, 0.000000, 0.613877, -0.578823, 0.757196, -0.302684, +-1.002737, 0.995396, -23.770485, 0.000000, 0.718491, -0.583417, 0.789634, -0.190008, +-0.994652, 3.363289, -17.854239, 1.500000, 0.568689, -0.554925, 0.739714, -0.380633, +-1.000716, 1.899328, -20.774343, 0.000000, 0.613877, -0.578823, 0.757196, -0.302684, +-1.334961, 1.211163, -20.628946, 0.687500, 0.612715, -0.999676, -0.020934, 0.014474, +-1.334961, 1.211163, -20.628946, 0.687500, 0.612715, -0.999676, -0.020934, 0.014474, +-1.000716, 0.522999, -20.483551, 1.046875, 0.600702, -0.555184, -0.771596, 0.310500, +-0.994652, 1.983473, -17.606916, 1.187500, 0.456561, -0.553223, -0.737418, 0.387504, +-0.994652, 1.983473, -17.606916, 1.187500, 0.456561, -0.553223, -0.737418, 0.387504, +-0.990610, 3.544037, -14.721523, 1.000000, 0.267209, -0.562098, -0.749029, 0.350717, +-1.324855, 4.237772, -14.807808, 2.000000, 0.395355, -0.999804, 0.015791, -0.011962, +-1.324855, 4.237772, -14.807808, 2.000000, 0.395355, -0.999804, 0.015791, -0.011962, +-0.990610, 4.931509, -14.894089, 3.000000, 0.523501, -0.544986, 0.762408, -0.348891, +-0.994652, 3.363289, -17.854239, 1.500000, 0.568689, -0.554925, 0.739714, -0.380633, +-1.002737, 6.556976, -6.071414, 0.000000, -0.308178, -0.553122, 0.818963, 0.152824, +-1.000716, 6.770885, -8.754030, 0.000000, -0.079458, -0.549751, 0.833161, -0.060139, +-1.334961, 6.071638, -8.749280, 0.500000, -0.079458, -0.999000, 0.044233, -0.006500, +-1.334961, 6.071638, -8.749280, 0.500000, -0.079458, -0.999000, 0.044233, -0.006500, +-1.000716, 5.372389, -8.744530, 1.000000, -0.079458, -0.594849, -0.801661, 0.059106, +-1.002737, 5.163677, -6.177338, 1.000000, -0.308178, -0.587361, -0.794674, -0.153298, +-1.002737, 5.163677, -6.177338, 1.000000, -0.308178, -0.587361, -0.794674, -0.153298, +-1.002737, 4.402004, -3.694788, 1.000000, -0.537451, -0.571136, -0.774985, -0.270559, +-1.336982, 5.093796, -3.594290, 0.500000, -0.537451, -0.999877, 0.014256, 0.006545, +-1.336982, 5.093796, -3.594290, 0.500000, -0.537451, -0.999877, 0.014256, 0.006545, +-1.002737, 5.785589, -3.493792, 0.000000, -0.536897, -0.556039, 0.785897, 0.270530, +-1.002737, 6.556976, -6.071414, 0.000000, -0.308178, -0.553122, 0.818963, 0.152824, +-1.002737, 4.735826, -0.785002, 0.000000, -0.767833, -0.563593, 0.774459, 0.287360, +-1.002737, 5.785589, -3.493792, 0.000000, -0.536897, -0.556039, 0.785897, 0.270530, +-1.336982, 5.093796, -3.594290, 0.500000, -0.537451, -0.999877, 0.014256, 0.006545, +-1.336982, 5.093796, -3.594290, 0.500000, -0.537451, -0.999877, 0.014256, 0.006545, +-1.002737, 4.402004, -3.694788, 1.000000, -0.537451, -0.571136, -0.774985, -0.270559, +-1.002737, 3.362402, -1.013249, 1.000000, -0.767833, -0.559574, -0.778227, -0.285025, +-1.002737, 3.362402, -1.013249, 1.000000, -0.767833, -0.559574, -0.778227, -0.285025, +-1.002737, 2.394936, 1.783656, 1.046875, -0.973474, -0.550621, -0.806194, -0.216490, +-1.336982, 3.076645, 1.877820, 0.687500, -0.955495, -0.999725, -0.022213, -0.007478, +-1.336982, 3.076645, 1.877820, 0.687500, -0.955495, -0.999725, -0.022213, -0.007478, +-1.002737, 3.758350, 1.971984, 0.000000, -0.998770, -0.573360, 0.788967, 0.220880, +-1.002737, 4.735826, -0.785002, 0.000000, -0.767833, -0.563593, 0.774459, 0.287360, +-1.002737, 3.203825, 4.694192, 1.500000, -0.960717, -0.573166, 0.812586, 0.105755, +-1.002737, 3.758350, 1.971984, 0.000000, -0.998770, -0.573360, 0.788967, 0.220880, +-1.336982, 3.076645, 1.877820, 0.687500, -0.955495, -0.999725, -0.022213, -0.007478, +-1.336982, 3.076645, 1.877820, 0.687500, -0.955495, -0.999725, -0.022213, -0.007478, +-1.002737, 2.394936, 1.783656, 1.046875, -0.973474, -0.550621, -0.806194, -0.216490, +-1.002737, 1.849670, 4.612304, 1.187500, -1.128520, -0.548005, -0.830422, -0.100446, +-1.002737, 1.849670, 4.612304, 1.187500, -1.128520, -0.548005, -0.830422, -0.100446, +-1.002737, 1.707661, 7.456823, 1.000000, -1.306215, -0.546192, -0.837529, 0.014826, +-1.336982, 2.380295, 7.427917, 2.000000, -1.114440, -0.999670, -0.025705, 0.000199, +-1.336982, 2.380295, 7.427917, 2.000000, -1.114440, -0.999670, -0.025705, 0.000199, +-1.002737, 3.052929, 7.399012, 3.000000, -0.922665, -0.571504, 0.820505, -0.012461, +-1.002737, 3.203825, 4.694192, 1.500000, -0.960717, -0.573166, 0.812586, 0.105755, +-1.022346, 4.637777, 15.286472, 1.333333, -1.667888, -0.574184, 0.765044, -0.291584, +-1.007639, 3.836994, 12.751901, 0.000000, -1.613659, -0.571038, 0.793815, -0.209219, +-1.341885, 3.176014, 12.915927, 0.500000, -1.613659, -0.999798, -0.020077, 0.001135, +-1.341885, 3.176014, 12.915927, 0.500000, -1.613659, -0.999798, -0.020077, 0.001135, +-1.007639, 2.515034, 13.079953, 1.000000, -1.613659, -0.551445, -0.808533, 0.205386, +-1.022346, 3.341311, 15.726742, 1.166667, -1.691614, -0.553953, -0.781075, 0.288198, +-1.022346, 3.341311, 15.726742, 1.166667, -1.691614, -0.553953, -0.781075, 0.288198, +-1.032151, 4.412262, 18.174877, 1.000000, -1.776346, -0.555665, -0.740194, 0.378615, +-1.366396, 5.044981, 17.903212, 1.833333, -1.749232, -0.999757, -0.019426, 0.010462, +-1.366396, 5.044981, 17.903212, 1.833333, -1.749232, -0.999757, -0.019426, 0.010462, +-1.032151, 5.677700, 17.631544, 2.666667, -1.722117, -0.577835, 0.723604, -0.377496, +-1.022346, 4.637777, 15.286472, 1.333333, -1.667888, -0.574184, 0.765044, -0.291584, +-1.002737, 8.987209, 23.827108, 0.500000, -2.000000, -0.690086, 0.408969, 0.597098, +-0.742768, 9.282909, 23.329664, 0.000000, -2.000000, -0.487251, 0.872639, 0.032983, +-1.002737, 9.038933, 22.663582, 0.000000, -1.969517, -0.582357, 0.720010, -0.377421, +-1.002737, 9.038933, 22.663582, 0.000000, -1.969517, -0.582357, 0.720010, -0.377421, +-1.007639, 8.160118, 21.422651, 0.000000, -1.939034, -0.574068, 0.669723, -0.471080, +-1.341885, 7.556932, 21.789433, 0.500000, -1.939034, -0.999989, 0.000304, 0.004665, +-1.341885, 7.556932, 21.789433, 0.500000, -1.939034, -0.999989, 0.000304, 0.004665, +-1.007639, 6.953747, 22.156216, 1.000000, -1.939034, -0.571627, -0.672843, 0.469600, +-1.002737, 7.854620, 23.452549, 1.000000, -1.969517, -0.579230, -0.604597, 0.546768, +-1.002737, 7.854620, 23.452549, 1.000000, -1.969517, -0.579230, -0.604597, 0.546768, +-0.742768, 8.411285, 23.925793, 1.000000, -2.000000, -0.485429, -0.281111, 0.827850, +-1.002737, 8.987209, 23.827108, 0.500000, -2.000000, -0.690086, 0.408969, 0.597098, +1.002737, -1.292564, -32.294174, 2.000000, 0.972854, 0.576237, -0.817066, 0.018853, +1.002737, -1.259859, -30.876823, 2.000000, 0.937170, 0.573164, -0.818795, 0.032517, +0.000000, -1.495502, -30.862072, 1.500000, 0.937170, 0.000000, -0.999196, 0.040090, +0.000000, -1.495502, -30.862072, 1.500000, 0.937170, 0.000000, -0.999196, 0.040090, +-1.002737, -1.259859, -30.876823, 1.000000, 0.937170, -0.573164, -0.818796, 0.032517, +-1.002737, -1.292564, -32.294178, 1.000000, 0.972854, -0.576236, -0.817066, 0.018853, +-1.002737, -1.156864, -28.875961, 1.000000, 0.884407, -0.570246, -0.818776, 0.066533, +-1.002737, -1.259859, -30.876823, 1.000000, 0.937170, -0.573164, -0.818796, 0.032517, +0.000000, -1.495502, -30.862072, 1.500000, 0.937170, 0.000000, -0.999196, 0.040090, +0.000000, -1.495502, -30.862072, 1.500000, 0.937170, 0.000000, -0.999196, 0.040090, +1.002737, -1.259859, -30.876823, 2.000000, 0.937170, 0.573164, -0.818795, 0.032517, +1.002737, -1.156864, -28.875965, 2.000000, 0.884407, 0.570246, -0.818775, 0.066533, +1.002737, -1.156864, -28.875965, 2.000000, 0.884407, 0.570246, -0.818775, 0.066533, +1.002737, -0.895025, -26.385365, 2.000000, 0.812277, 0.568649, -0.814249, 0.116778, +0.000000, -1.126870, -26.349302, 1.500000, 0.812277, 0.000000, -0.989855, 0.142082, +0.000000, -1.126870, -26.349302, 1.500000, 0.812277, 0.000000, -0.989855, 0.142082, +-1.002737, -0.895025, -26.385366, 1.000000, 0.812277, -0.568649, -0.814249, 0.116778, +-1.002737, -1.156864, -28.875961, 1.000000, 0.884407, -0.570246, -0.818776, 0.066533, +-1.002737, -0.385786, -23.498796, 1.000000, 0.718491, -0.565019, -0.802220, 0.192863, +-1.002737, -0.895025, -26.385366, 1.000000, 0.812277, -0.568649, -0.814249, 0.116778, +0.000000, -1.126870, -26.349302, 1.500000, 0.812277, 0.000000, -0.989855, 0.142082, +0.000000, -1.126870, -26.349302, 1.500000, 0.812277, 0.000000, -0.989855, 0.142082, +1.002737, -0.895025, -26.385365, 2.000000, 0.812277, 0.568649, -0.814249, 0.116778, +1.002737, -0.385786, -23.498796, 2.000000, 0.718491, 0.564910, -0.802377, 0.192532, +1.002737, -0.385786, -23.498796, 2.000000, 0.718491, 0.564910, -0.802377, 0.192532, +1.004758, 0.522999, -20.483551, 2.000000, 0.596697, 0.555081, -0.772140, 0.309331, +0.002021, 0.293610, -20.435085, 1.500000, 0.596697, -0.000089, -0.928581, 0.371129, +0.002021, 0.293610, -20.435085, 1.500000, 0.596697, -0.000089, -0.928581, 0.371129, +-1.000716, 0.522999, -20.483551, 1.046875, 0.600702, -0.555184, -0.771596, 0.310500, +-1.002737, -0.385786, -23.498796, 1.000000, 0.718491, -0.565019, -0.802220, 0.192863, +-0.994652, 1.983473, -17.606916, 1.187500, 0.456561, -0.553223, -0.737418, 0.387504, +-1.000716, 0.522999, -20.483551, 1.046875, 0.600702, -0.555184, -0.771596, 0.310500, +0.002021, 0.293610, -20.435085, 1.500000, 0.596697, -0.000089, -0.928581, 0.371129, +0.002021, 0.293610, -20.435085, 1.500000, 0.596697, -0.000089, -0.928581, 0.371129, +1.004758, 0.522999, -20.483551, 2.000000, 0.596697, 0.555081, -0.772140, 0.309331, +1.010821, 1.983473, -17.606916, 2.000000, 0.440543, 0.553586, -0.738015, 0.385845, +1.010821, 1.983473, -17.606916, 2.000000, 0.440543, 0.553586, -0.738015, 0.385845, +1.014864, 3.544037, -14.721523, 2.000000, 0.267209, 0.562535, -0.748836, 0.350428, +0.012127, 3.312792, -14.692760, 1.500000, 0.267209, 0.000169, -0.904592, 0.426279, +0.012127, 3.312792, -14.692760, 1.500000, 0.267209, 0.000169, -0.904592, 0.426279, +-0.990610, 3.544037, -14.721523, 1.000000, 0.267209, -0.562098, -0.749029, 0.350717, +-0.994652, 1.983473, -17.606916, 1.187500, 0.456561, -0.553223, -0.737418, 0.387504, +-1.002737, 5.163677, -6.177338, 1.000000, -0.308178, -0.587361, -0.794674, -0.153298, +-1.000716, 5.372389, -8.744530, 1.000000, -0.079458, -0.594849, -0.801661, 0.059106, +0.002021, 5.139305, -8.742946, 1.500000, -0.079458, -0.000101, -0.997122, 0.075814, +0.002021, 5.139305, -8.742946, 1.500000, -0.079458, -0.000101, -0.997122, 0.075814, +1.004758, 5.372389, -8.744530, 2.000000, -0.079458, 0.594556, -0.801738, 0.060986, +1.002737, 5.163681, -6.177338, 2.000000, -0.308178, 0.587260, -0.794834, -0.152858, +1.002737, 5.163681, -6.177338, 2.000000, -0.308178, 0.587260, -0.794834, -0.152858, +1.002737, 4.402004, -3.694788, 2.000000, -0.537451, 0.571136, -0.774985, -0.270560, +0.000000, 4.171406, -3.728287, 1.500000, -0.537451, 0.000000, -0.943782, -0.330570, +0.000000, 4.171406, -3.728287, 1.500000, -0.537451, 0.000000, -0.943782, -0.330570, +-1.002737, 4.402004, -3.694788, 1.000000, -0.537451, -0.571136, -0.774985, -0.270559, +-1.002737, 5.163677, -6.177338, 1.000000, -0.308178, -0.587361, -0.794674, -0.153298, +-1.002737, 3.362402, -1.013249, 1.000000, -0.767833, -0.559574, -0.778227, -0.285025, +-1.002737, 4.402004, -3.694788, 1.000000, -0.537451, -0.571136, -0.774985, -0.270559, +0.000000, 4.171406, -3.728287, 1.500000, -0.537451, 0.000000, -0.943782, -0.330570, +0.000000, 4.171406, -3.728287, 1.500000, -0.537451, 0.000000, -0.943782, -0.330570, +1.002737, 4.402004, -3.694788, 2.000000, -0.537451, 0.571136, -0.774985, -0.270560, +1.002737, 3.362402, -1.013249, 2.000000, -0.767833, 0.559574, -0.778227, -0.285025, +1.002737, 3.362402, -1.013249, 2.000000, -0.767833, 0.559574, -0.778227, -0.285025, +1.002737, 2.394936, 1.783656, 2.000000, -0.979466, 0.550621, -0.806194, -0.216490, +0.000000, 2.167702, 1.752268, 1.500000, -0.979466, -0.000000, -0.966229, -0.257685, +0.000000, 2.167702, 1.752268, 1.500000, -0.979466, -0.000000, -0.966229, -0.257685, +-1.002737, 2.394936, 1.783656, 1.046875, -0.973474, -0.550621, -0.806194, -0.216490, +-1.002737, 3.362402, -1.013249, 1.000000, -0.767833, -0.559574, -0.778227, -0.285025, +-1.002737, 1.849670, 4.612304, 1.187500, -1.128520, -0.548005, -0.830422, -0.100446, +-1.002737, 2.394936, 1.783656, 1.046875, -0.973474, -0.550621, -0.806194, -0.216490, +0.000000, 2.167702, 1.752268, 1.500000, -0.979466, -0.000000, -0.966229, -0.257685, +0.000000, 2.167702, 1.752268, 1.500000, -0.979466, -0.000000, -0.966229, -0.257685, +1.002737, 2.394936, 1.783656, 2.000000, -0.979466, 0.550621, -0.806194, -0.216490, +1.002737, 1.849670, 4.612304, 2.000000, -1.152493, 0.548005, -0.830422, -0.100446, +1.002737, 1.849670, 4.612304, 2.000000, -1.152493, 0.548005, -0.830422, -0.100446, +1.002737, 1.707661, 7.456823, 2.000000, -1.306215, 0.546192, -0.837529, 0.014826, +0.000000, 1.483450, 7.466458, 1.500000, -1.306215, 0.000000, -0.999837, 0.018050, +0.000000, 1.483450, 7.466458, 1.500000, -1.306215, 0.000000, -0.999837, 0.018050, +-1.002737, 1.707661, 7.456823, 1.000000, -1.306215, -0.546192, -0.837529, 0.014826, +-1.002737, 1.849670, 4.612304, 1.187500, -1.128520, -0.548005, -0.830422, -0.100446, +-1.022346, 3.341311, 15.726742, 1.166667, -1.691614, -0.553953, -0.781075, 0.288198, +-1.007639, 2.515034, 13.079953, 1.000000, -1.613659, -0.551445, -0.808533, 0.205386, +-0.004902, 2.294706, 13.134627, 1.500000, -1.613659, 0.000247, -0.968748, 0.248048, +-0.004902, 2.294706, 13.134627, 1.500000, -1.613659, 0.000247, -0.968748, 0.248048, +0.997835, 2.515034, 13.079953, 2.000000, -1.613659, 0.552074, -0.807195, 0.208929, +0.983128, 3.341311, 15.726744, 2.000000, -1.695003, 0.553551, -0.779630, 0.292845, +0.983128, 3.341311, 15.726744, 2.000000, -1.695003, 0.553551, -0.779630, 0.292845, +0.973323, 4.412262, 18.174875, 2.000000, -1.776346, 0.554281, -0.740975, 0.379115, +-0.029414, 4.201355, 18.265430, 1.500000, -1.776346, -0.000535, -0.890739, 0.454514, +-0.029414, 4.201355, 18.265430, 1.500000, -1.776346, -0.000535, -0.890739, 0.454514, +-1.032151, 4.412262, 18.174877, 1.000000, -1.776346, -0.555665, -0.740194, 0.378615, +-1.022346, 3.341311, 15.726742, 1.166667, -1.691614, -0.553953, -0.781075, 0.288198, +0.000000, 8.401409, 24.234768, 1.500000, -2.000000, -0.000001, -0.291501, 0.956571, +-0.742768, 8.411285, 23.925793, 1.000000, -2.000000, -0.485429, -0.281111, 0.827850, +-1.002737, 7.854620, 23.452549, 1.000000, -1.969517, -0.579230, -0.604597, 0.546768, +-1.002737, 7.854620, 23.452549, 1.000000, -1.969517, -0.579230, -0.604597, 0.546768, +-1.007639, 6.953747, 22.156216, 1.000000, -1.939034, -0.571627, -0.672843, 0.469600, +-0.004902, 6.752687, 22.278475, 1.500000, -1.939034, 0.000369, -0.822635, 0.568570, +-0.004902, 6.752687, 22.278475, 1.500000, -1.939034, 0.000369, -0.822635, 0.568570, +0.997835, 6.953747, 22.156214, 2.000000, -1.939034, 0.572743, -0.675634, 0.464203, +1.002737, 7.854620, 23.452549, 2.000000, -1.969517, 0.580173, -0.605657, 0.544591, +1.002737, 7.854620, 23.452549, 2.000000, -1.969517, 0.580173, -0.605657, 0.544591, +0.742768, 8.411285, 23.925795, 2.000000, -2.000000, 0.485428, -0.281111, 0.827851, +0.000000, 8.401409, 24.234768, 1.500000, -2.000000, -0.000001, -0.291501, 0.956571, +1.002737, 0.129889, -32.334755, 2.937500, 0.946466, 0.578352, 0.815661, -0.014359, +1.002737, 0.153999, -30.965355, 2.906250, 0.897588, 0.580105, 0.814042, -0.028521, +1.336982, -0.552929, -30.921089, 2.500000, 0.937170, 0.999978, -0.006539, 0.000687, +1.336982, -0.552929, -30.921089, 2.500000, 0.937170, 0.999978, -0.006539, 0.000687, +1.002737, -1.259859, -30.876823, 2.000000, 0.937170, 0.573164, -0.818795, 0.032517, +1.002737, -1.292564, -32.294174, 2.000000, 0.972854, 0.576237, -0.817066, 0.018853, +1.002737, -1.156864, -28.875965, 2.000000, 0.884407, 0.570246, -0.818775, 0.066533, +1.002737, -1.259859, -30.876823, 2.000000, 0.937170, 0.573164, -0.818795, 0.032517, +1.336982, -0.552929, -30.921089, 2.500000, 0.937170, 0.999978, -0.006539, 0.000687, +1.336982, -0.552929, -30.921089, 2.500000, 0.937170, 0.999978, -0.006539, 0.000687, +1.002737, 0.153999, -30.965355, 2.906250, 0.897588, 0.580105, 0.814042, -0.028521, +1.002737, 0.245815, -29.027195, 2.937500, 0.858019, 0.580554, 0.811733, -0.063605, +1.002737, 0.245815, -29.027195, 2.937500, 0.858019, 0.580554, 0.811733, -0.063605, +1.002737, 0.496042, -26.601746, 2.968750, 0.804268, 0.581048, 0.805721, -0.114877, +1.336982, -0.199492, -26.493555, 2.500000, 0.812277, 0.999928, -0.011914, 0.001651, +1.336982, -0.199492, -26.493555, 2.500000, 0.812277, 0.999928, -0.011914, 0.001651, +1.002737, -0.895025, -26.385365, 2.000000, 0.812277, 0.568649, -0.814249, 0.116778, +1.002737, -1.156864, -28.875965, 2.000000, 0.884407, 0.570246, -0.818775, 0.066533, +1.002737, -0.385786, -23.498796, 2.000000, 0.718491, 0.564910, -0.802377, 0.192532, +1.002737, -0.895025, -26.385365, 2.000000, 0.812277, 0.568649, -0.814249, 0.116778, +1.336982, -0.199492, -26.493555, 2.500000, 0.812277, 0.999928, -0.011914, 0.001651, +1.336982, -0.199492, -26.493555, 2.500000, 0.812277, 0.999928, -0.011914, 0.001651, +1.002737, 0.496042, -26.601746, 2.968750, 0.804268, 0.581048, 0.805721, -0.114877, +1.002737, 0.995396, -23.770485, 2.937500, 0.712843, 0.583294, 0.789623, -0.190427, +1.002737, 0.995396, -23.770485, 2.937500, 0.712843, 0.583294, 0.789623, -0.190427, +1.004758, 1.899328, -20.774343, 2.890625, 0.592229, 0.578470, 0.756840, -0.304248, +1.339004, 1.211163, -20.628948, 2.500000, 0.596697, 0.999699, -0.021427, 0.011933, +1.339004, 1.211163, -20.628948, 2.500000, 0.596697, 0.999699, -0.021427, 0.011933, +1.004758, 0.522999, -20.483551, 2.000000, 0.596697, 0.555081, -0.772140, 0.309331, +1.002737, -0.385786, -23.498796, 2.000000, 0.718491, 0.564910, -0.802377, 0.192532, +1.010821, 1.983473, -17.606916, 2.000000, 0.440543, 0.553586, -0.738015, 0.385845, +1.004758, 0.522999, -20.483551, 2.000000, 0.596697, 0.555081, -0.772140, 0.309331, +1.339004, 1.211163, -20.628948, 2.500000, 0.596697, 0.999699, -0.021427, 0.011933, +1.339004, 1.211163, -20.628948, 2.500000, 0.596697, 0.999699, -0.021427, 0.011933, +1.004758, 1.899328, -20.774343, 2.890625, 0.592229, 0.578470, 0.756840, -0.304248, +1.010821, 3.363289, -17.854240, 2.875000, 0.450913, 0.554791, 0.739026, -0.382161, +1.010821, 3.363289, -17.854240, 2.875000, 0.450913, 0.554791, 0.739026, -0.382161, +1.014864, 4.931509, -14.894089, 3.000000, 0.267209, 0.545447, 0.762198, -0.348629, +1.349109, 4.237772, -14.807808, 2.500000, 0.267209, 0.999805, 0.015731, -0.011963, +1.349109, 4.237772, -14.807808, 2.500000, 0.267209, 0.999805, 0.015731, -0.011963, +1.014864, 3.544037, -14.721523, 2.000000, 0.267209, 0.562535, -0.748836, 0.350428, +1.010821, 1.983473, -17.606916, 2.000000, 0.440543, 0.553586, -0.738015, 0.385845, +1.002737, 5.163681, -6.177338, 2.000000, -0.308178, 0.587260, -0.794834, -0.152858, +1.004758, 5.372389, -8.744530, 2.000000, -0.079458, 0.594556, -0.801738, 0.060986, +1.339004, 6.071638, -8.749280, 2.500000, -0.079458, 0.999013, 0.044275, -0.003633, +1.339004, 6.071638, -8.749280, 2.500000, -0.079458, 0.999013, 0.044275, -0.003633, +1.004758, 6.770885, -8.754030, 3.000000, -0.079458, 0.549543, 0.833398, -0.058740, +1.002737, 6.556976, -6.071414, 2.937500, -0.360878, 0.552962, 0.818993, 0.153246, +1.002737, 6.556976, -6.071414, 2.937500, -0.360878, 0.552962, 0.818993, 0.153246, +1.002737, 5.785589, -3.493792, 2.968750, -0.549437, 0.556039, 0.785897, 0.270530, +1.336982, 5.093796, -3.594290, 2.500000, -0.537451, 0.999877, 0.014256, 0.006545, +1.336982, 5.093796, -3.594290, 2.500000, -0.537451, 0.999877, 0.014256, 0.006545, +1.002737, 4.402004, -3.694788, 2.000000, -0.537451, 0.571136, -0.774985, -0.270560, +1.002737, 5.163681, -6.177338, 2.000000, -0.308178, 0.587260, -0.794834, -0.152858, +1.002737, 3.362402, -1.013249, 2.000000, -0.767833, 0.559574, -0.778227, -0.285025, +1.002737, 4.402004, -3.694788, 2.000000, -0.537451, 0.571136, -0.774985, -0.270560, +1.336982, 5.093796, -3.594290, 2.500000, -0.537451, 0.999877, 0.014256, 0.006545, +1.336982, 5.093796, -3.594290, 2.500000, -0.537451, 0.999877, 0.014256, 0.006545, +1.002737, 5.785589, -3.493792, 2.968750, -0.549437, 0.556039, 0.785897, 0.270530, +1.002737, 4.735826, -0.785002, 2.937500, -0.763077, 0.563593, 0.774459, 0.287360, +1.002737, 4.735826, -0.785002, 2.937500, -0.763077, 0.563593, 0.774459, 0.287360, +1.002737, 3.758350, 1.971984, 2.890625, -0.966339, 0.573361, 0.788967, 0.220880, +1.336982, 3.076645, 1.877820, 2.500000, -0.979466, 0.999725, -0.022213, -0.007478, +1.336982, 3.076645, 1.877820, 2.500000, -0.979466, 0.999725, -0.022213, -0.007478, +1.002737, 2.394936, 1.783656, 2.000000, -0.979466, 0.550621, -0.806194, -0.216490, +1.002737, 3.362402, -1.013249, 2.000000, -0.767833, 0.559574, -0.778227, -0.285025, +1.336982, 2.380295, 7.427917, 2.500000, -1.306215, 0.999670, -0.025705, 0.000199, +1.002737, 1.707661, 7.456823, 2.000000, -1.306215, 0.546192, -0.837529, 0.014826, +1.002737, 1.849670, 4.612304, 2.000000, -1.152493, 0.548005, -0.830422, -0.100446, +1.002737, 1.849670, 4.612304, 2.000000, -1.152493, 0.548005, -0.830422, -0.100446, +1.002737, 2.394936, 1.783656, 2.000000, -0.979466, 0.550621, -0.806194, -0.216490, +1.336982, 3.076645, 1.877820, 2.500000, -0.979466, 0.999725, -0.022213, -0.007478, +1.336982, 3.076645, 1.877820, 2.500000, -0.979466, 0.999725, -0.022213, -0.007478, +1.002737, 3.758350, 1.971984, 2.890625, -0.966339, 0.573361, 0.788967, 0.220880, +1.002737, 3.203825, 4.694192, 2.875000, -1.123764, 0.573167, 0.812586, 0.105755, +1.002737, 3.203825, 4.694192, 2.875000, -1.123764, 0.573167, 0.812586, 0.105755, +1.002737, 3.052929, 7.399012, 3.000000, -1.306215, 0.571504, 0.820504, -0.012461, +1.336982, 2.380295, 7.427917, 2.500000, -1.306215, 0.999670, -0.025705, 0.000199, +0.983128, 3.341311, 15.726744, 2.000000, -1.695003, 0.553551, -0.779630, 0.292845, +0.997835, 2.515034, 13.079953, 2.000000, -1.613659, 0.552074, -0.807195, 0.208929, +1.332080, 3.176014, 12.915927, 2.500000, -1.613659, 0.999801, -0.018232, 0.008046, +1.332080, 3.176014, 12.915927, 2.500000, -1.613659, 0.999801, -0.018232, 0.008046, +0.997834, 3.836994, 12.751901, 3.000000, -1.613659, 0.571655, 0.794480, -0.204969, +0.983128, 4.637777, 15.286472, 2.833333, -1.698392, 0.573967, 0.767126, -0.286495, +0.983128, 4.637777, 15.286472, 2.833333, -1.698392, 0.573967, 0.767126, -0.286495, +0.973323, 5.677700, 17.631544, 3.000000, -1.776346, 0.576561, 0.724323, -0.378066, +1.307569, 5.044981, 17.903212, 2.500000, -1.776346, 0.999751, -0.019683, 0.010530, +1.307569, 5.044981, 17.903212, 2.500000, -1.776346, 0.999751, -0.019683, 0.010530, +0.973323, 4.412262, 18.174875, 2.000000, -1.776346, 0.554281, -0.740975, 0.379115, +0.983128, 3.341311, 15.726744, 2.000000, -1.695003, 0.553551, -0.779630, 0.292845, +1.002737, 8.987209, 23.827108, 2.500000, -2.000000, 0.690085, 0.408969, 0.597099, +0.742768, 8.411285, 23.925795, 2.000000, -2.000000, 0.485428, -0.281111, 0.827851, +1.002737, 7.854620, 23.452549, 2.000000, -1.969517, 0.580173, -0.605657, 0.544591, +1.002737, 7.854620, 23.452549, 2.000000, -1.969517, 0.580173, -0.605657, 0.544591, +0.997835, 6.953747, 22.156214, 2.000000, -1.939034, 0.572743, -0.675634, 0.464203, +1.332080, 7.556932, 21.789433, 2.500000, -1.939034, 0.999977, -0.005048, -0.004524, +1.332080, 7.556932, 21.789433, 2.500000, -1.939034, 0.999977, -0.005048, -0.004524, +0.997834, 8.160118, 21.422651, 3.000000, -1.939034, 0.574744, 0.665807, -0.475784, +1.002737, 9.038933, 22.663582, 3.000000, -1.969517, 0.583232, 0.718345, -0.379238, +1.002737, 9.038933, 22.663582, 3.000000, -1.969517, 0.583232, 0.718345, -0.379238, +0.742768, 9.282909, 23.329664, 3.000000, -2.000000, 0.487250, 0.872639, 0.032983, +1.002737, 8.987209, 23.827108, 2.500000, -2.000000, 0.690085, 0.408969, 0.597099, +-1.002737, 0.129889, -32.334755, 3.500000, 0.761751, -0.578352, 0.815661, -0.014359, +-1.002737, 0.153999, -30.965355, 3.000000, 0.523501, -0.580105, 0.814042, -0.028521, +0.000000, 0.389645, -30.980114, 3.125000, 0.778842, -0.000000, 0.999403, -0.034561, +0.000000, 0.389645, -30.980114, 3.125000, 0.778842, -0.000000, 0.999403, -0.034561, +1.002737, 0.153999, -30.965355, 2.906250, 0.897588, 0.580105, 0.814042, -0.028521, +1.002737, 0.129889, -32.334755, 2.937500, 0.946466, 0.578352, 0.815661, -0.014359, +1.002737, 0.245815, -29.027195, 2.937500, 0.858019, 0.580554, 0.811733, -0.063605, +1.002737, 0.153999, -30.965355, 2.906250, 0.897588, 0.580105, 0.814042, -0.028521, +0.000000, 0.389645, -30.980114, 3.125000, 0.778842, -0.000000, 0.999403, -0.034561, +0.000000, 0.389645, -30.980114, 3.125000, 0.778842, -0.000000, 0.999403, -0.034561, +-1.002737, 0.153999, -30.965355, 3.000000, 0.523501, -0.580105, 0.814042, -0.028521, +-1.002737, 0.245815, -29.027195, 3.500000, 0.673303, -0.580554, 0.811733, -0.063605, +-1.002737, 0.245815, -29.027195, 3.500000, 0.673303, -0.580554, 0.811733, -0.063605, +-1.002737, 0.496042, -26.601746, 4.000000, 0.823105, -0.581048, 0.805721, -0.114877, +0.000000, 0.727886, -26.637808, 3.375000, 0.780241, 0.000000, 0.990007, -0.141020, +0.000000, 0.727886, -26.637808, 3.375000, 0.780241, 0.000000, 0.990007, -0.141020, +1.002737, 0.496042, -26.601746, 2.968750, 0.804268, 0.581048, 0.805721, -0.114877, +1.002737, 0.245815, -29.027195, 2.937500, 0.858019, 0.580554, 0.811733, -0.063605, +1.002737, 0.995396, -23.770485, 2.937500, 0.712843, 0.583294, 0.789623, -0.190427, +1.002737, 0.496042, -26.601746, 2.968750, 0.804268, 0.581048, 0.805721, -0.114877, +0.000000, 0.727886, -26.637808, 3.375000, 0.780241, 0.000000, 0.990007, -0.141020, +0.000000, 0.727886, -26.637808, 3.375000, 0.780241, 0.000000, 0.990007, -0.141020, +-1.002737, 0.496042, -26.601746, 4.000000, 0.823105, -0.581048, 0.805721, -0.114877, +-1.002737, 0.995396, -23.770485, 3.500000, 0.673303, -0.583417, 0.789634, -0.190008, +-1.002737, 0.995396, -23.770485, 3.500000, 0.673303, -0.583417, 0.789634, -0.190008, +-1.000716, 1.899328, -20.774343, 3.000000, 0.523501, -0.578823, 0.757196, -0.302684, +0.002021, 2.128716, -20.822807, 3.062500, 0.578824, -0.000086, 0.927679, -0.373379, +0.002021, 2.128716, -20.822807, 3.062500, 0.578824, -0.000086, 0.927679, -0.373379, +1.004758, 1.899328, -20.774343, 2.890625, 0.592229, 0.578470, 0.756840, -0.304248, +1.002737, 0.995396, -23.770485, 2.937500, 0.712843, 0.583294, 0.789623, -0.190427, +0.012127, 5.162754, -14.922852, 3.000000, 0.395355, 0.000167, 0.910359, -0.413819, +1.014864, 4.931509, -14.894089, 3.000000, 0.267209, 0.545447, 0.762198, -0.348629, +1.010821, 3.363289, -17.854240, 2.875000, 0.450913, 0.554791, 0.739026, -0.382161, +1.010821, 3.363289, -17.854240, 2.875000, 0.450913, 0.554791, 0.739026, -0.382161, +1.004758, 1.899328, -20.774343, 2.890625, 0.592229, 0.578470, 0.756840, -0.304248, +0.002021, 2.128716, -20.822807, 3.062500, 0.578824, -0.000086, 0.927679, -0.373379, +0.002021, 2.128716, -20.822807, 3.062500, 0.578824, -0.000086, 0.927679, -0.373379, +-1.000716, 1.899328, -20.774343, 3.000000, 0.523501, -0.578823, 0.757196, -0.302684, +-0.994652, 3.363289, -17.854239, 3.000000, 0.523501, -0.554925, 0.739714, -0.380633, +-0.994652, 3.363289, -17.854239, 3.000000, 0.523501, -0.554925, 0.739714, -0.380633, +-0.990610, 4.931509, -14.894089, 3.000000, 0.523501, -0.544986, 0.762408, -0.348891, +0.012127, 5.162754, -14.922852, 3.000000, 0.395355, 0.000167, 0.910359, -0.413819, +1.002737, 6.556976, -6.071414, 2.937500, -0.360878, 0.552962, 0.818993, 0.153246, +1.004758, 6.770885, -8.754030, 3.000000, -0.079458, 0.549543, 0.833398, -0.058740, +0.002021, 7.003967, -8.755614, 3.000000, -0.501061, -0.000102, 0.997541, -0.070087, +0.002021, 7.003967, -8.755614, 3.000000, -0.501061, -0.000102, 0.997541, -0.070087, +-1.000716, 6.770885, -8.754030, 3.000000, -0.922665, -0.549751, 0.833161, -0.060139, +-1.002737, 6.556976, -6.071414, 3.500000, -0.729781, -0.553122, 0.818963, 0.152824, +-1.002737, 6.556976, -6.071414, 3.500000, -0.729781, -0.553122, 0.818963, 0.152824, +-1.002737, 5.785589, -3.493792, 4.000000, -0.536897, -0.556039, 0.785897, 0.270530, +0.000000, 6.016188, -3.460293, 3.375000, -0.585395, -0.000000, 0.945916, 0.324411, +0.000000, 6.016188, -3.460293, 3.375000, -0.585395, -0.000000, 0.945916, 0.324411, +1.002737, 5.785589, -3.493792, 2.968750, -0.549437, 0.556039, 0.785897, 0.270530, +1.002737, 6.556976, -6.071414, 2.937500, -0.360878, 0.552962, 0.818993, 0.153246, +1.002737, 4.735826, -0.785002, 2.937500, -0.763077, 0.563593, 0.774459, 0.287360, +1.002737, 5.785589, -3.493792, 2.968750, -0.549437, 0.556039, 0.785897, 0.270530, +0.000000, 6.016188, -3.460293, 3.375000, -0.585395, -0.000000, 0.945916, 0.324411, +0.000000, 6.016188, -3.460293, 3.375000, -0.585395, -0.000000, 0.945916, 0.324411, +-1.002737, 5.785589, -3.493792, 4.000000, -0.536897, -0.556039, 0.785897, 0.270530, +-1.002737, 4.735826, -0.785002, 3.500000, -0.729781, -0.563593, 0.774459, 0.287360, +-1.002737, 4.735826, -0.785002, 3.500000, -0.729781, -0.563593, 0.774459, 0.287360, +-1.002737, 3.758350, 1.971984, 3.000000, -0.922665, -0.573360, 0.788967, 0.220880, +0.000000, 3.985586, 2.003372, 3.062500, -0.926955, 0.000000, 0.962477, 0.271365, +0.000000, 3.985586, 2.003372, 3.062500, -0.926955, 0.000000, 0.962477, 0.271365, +1.002737, 3.758350, 1.971984, 2.890625, -0.966339, 0.573361, 0.788967, 0.220880, +1.002737, 4.735826, -0.785002, 2.937500, -0.763077, 0.563593, 0.774459, 0.287360, +1.002737, 3.203825, 4.694192, 2.875000, -1.123764, 0.573167, 0.812586, 0.105755, +1.002737, 3.758350, 1.971984, 2.890625, -0.966339, 0.573361, 0.788967, 0.220880, +0.000000, 3.985586, 2.003372, 3.062500, -0.926955, 0.000000, 0.962477, 0.271365, +0.000000, 3.985586, 2.003372, 3.062500, -0.926955, 0.000000, 0.962477, 0.271365, +-1.002737, 3.758350, 1.971984, 3.000000, -0.922665, -0.573360, 0.788967, 0.220880, +-1.002737, 3.203825, 4.694192, 3.000000, -0.922665, -0.573166, 0.812586, 0.105755, +-1.002737, 3.203825, 4.694192, 3.000000, -0.922665, -0.573166, 0.812586, 0.105755, +-1.002737, 3.052929, 7.399012, 3.000000, -0.922665, -0.571504, 0.820505, -0.012461, +0.000000, 3.277142, 7.389376, 3.000000, -1.114440, 0.000000, 0.999891, -0.014768, +0.000000, 3.277142, 7.389376, 3.000000, -1.114440, 0.000000, 0.999891, -0.014768, +1.002737, 3.052929, 7.399012, 3.000000, -1.306215, 0.571504, 0.820504, -0.012461, +1.002737, 3.203825, 4.694192, 2.875000, -1.123764, 0.573167, 0.812586, 0.105755, +-0.029414, 5.888605, 17.540989, 2.833333, -1.749232, -0.000556, 0.885983, -0.463718, +0.973323, 5.677700, 17.631544, 3.000000, -1.776346, 0.576561, 0.724323, -0.378066, +0.983128, 4.637777, 15.286472, 2.833333, -1.698392, 0.573967, 0.767126, -0.286495, +0.983128, 4.637777, 15.286472, 2.833333, -1.698392, 0.573967, 0.767126, -0.286495, +0.997834, 3.836994, 12.751901, 3.000000, -1.613659, 0.571655, 0.794480, -0.204969, +-0.004902, 4.057320, 12.697225, 2.833333, -1.667888, 0.000259, 0.967531, -0.252752, +-0.004902, 4.057320, 12.697225, 2.833333, -1.667888, 0.000259, 0.967531, -0.252752, +-1.007639, 3.836994, 12.751901, 2.666667, -1.722117, -0.571038, 0.793815, -0.209219, +-1.022346, 4.637777, 15.286472, 2.666667, -1.722117, -0.574184, 0.765044, -0.291584, +-1.022346, 4.637777, 15.286472, 2.666667, -1.722117, -0.574184, 0.765044, -0.291584, +-1.032151, 5.677700, 17.631544, 2.666667, -1.722117, -0.577835, 0.723604, -0.377496, +-0.029414, 5.888605, 17.540989, 2.833333, -1.749232, -0.000556, 0.885983, -0.463718, +0.000000, 9.573013, 23.419453, 3.500000, -2.000000, -0.000000, 0.997856, 0.065453, +0.742768, 9.282909, 23.329664, 3.000000, -2.000000, 0.487250, 0.872639, 0.032983, +1.002737, 9.038933, 22.663582, 3.000000, -1.969517, 0.583232, 0.718345, -0.379238, +1.002737, 9.038933, 22.663582, 3.000000, -1.969517, 0.583232, 0.718345, -0.379238, +0.997834, 8.160118, 21.422651, 3.000000, -1.939034, 0.574744, 0.665807, -0.475784, +-0.004902, 8.361179, 21.300390, 3.500000, -1.939034, 0.000389, 0.815229, -0.579139, +-0.004902, 8.361179, 21.300390, 3.500000, -1.939034, 0.000389, 0.815229, -0.579139, +-1.007639, 8.160118, 21.422651, 4.000000, -1.939034, -0.574068, 0.669723, -0.471080, +-1.002737, 9.038933, 22.663582, 4.000000, -1.969517, -0.582357, 0.720010, -0.377421, +-1.002737, 9.038933, 22.663582, 4.000000, -1.969517, -0.582357, 0.720010, -0.377421, +-0.742768, 9.282909, 23.329664, 4.000000, -2.000000, -0.487251, 0.872639, 0.032983, +0.000000, 9.573013, 23.419453, 3.500000, -2.000000, -0.000000, 0.997856, 0.065453, +-1.002737, -2.734034, 6.657467, 1.500000, 0.761751, -0.582703, 0.762742, 0.280503, +-1.002737, -1.996943, 4.816424, 0.000000, 1.000000, -0.580237, 0.756078, 0.302774, +-1.336982, -2.618040, 4.463405, 0.500000, 1.000000, -0.999977, -0.006223, -0.002555, +-1.336982, -2.618040, 4.463405, 0.500000, 1.000000, -0.999977, -0.006223, -0.002555, +-1.002737, -3.239137, 4.110385, 1.000000, 1.000000, -0.573276, -0.760494, -0.304965, +-1.002737, -3.988198, 5.977939, 1.187500, 0.890530, -0.568961, -0.771457, -0.284847, +-1.002737, -3.988198, 5.977939, 1.187500, 0.890530, -0.568961, -0.771457, -0.284847, +-1.002737, -4.824668, 8.406097, 1.000000, 0.817855, -0.564875, -0.790113, -0.237986, +-1.336982, -4.187579, 8.722692, 2.000000, 0.670678, -0.999851, -0.016874, -0.003651, +-1.336982, -4.187579, 8.722692, 2.000000, 0.670678, -0.999851, -0.016874, -0.003651, +-1.002737, -3.550490, 9.039287, 3.000000, 0.523501, -0.582189, 0.779143, 0.232362, +-1.002737, -2.734034, 6.657467, 1.500000, 0.761751, -0.582703, 0.762742, 0.280503, +-1.002737, -4.339600, 12.037193, 0.000000, 0.651188, -0.578711, 0.795540, 0.179472, +-1.002737, -3.550490, 9.039287, 0.000000, 0.817855, -0.582189, 0.779143, 0.232362, +-1.336982, -4.187579, 8.722692, 0.500000, 0.817855, -0.999851, -0.016874, -0.003651, +-1.336982, -4.187579, 8.722692, 0.500000, 0.817855, -0.999851, -0.016874, -0.003651, +-1.002737, -4.824668, 8.406097, 1.000000, 0.817855, -0.564875, -0.790113, -0.237986, +-1.002737, -5.641894, 11.472322, 1.000000, 0.651188, -0.564280, -0.804601, -0.184946, +-1.002737, -5.641894, 11.472322, 1.000000, 0.651188, -0.564280, -0.804601, -0.184946, +-1.002737, -6.318611, 14.911804, 1.000000, 0.470545, -0.563019, -0.816504, -0.127790, +-1.336982, -5.652997, 15.157051, 0.500000, 0.470545, -0.999903, -0.013895, -0.000479, +-1.336982, -5.652997, 15.157051, 0.500000, 0.470545, -0.999903, -0.013895, -0.000479, +-1.002737, -4.987385, 15.402298, 0.000000, 0.484521, -0.576620, 0.807781, 0.122473, +-1.002737, -4.339600, 12.037193, 0.000000, 0.651188, -0.578711, 0.795540, 0.179472, +-1.002737, -5.379865, 18.885717, 0.000000, 0.261948, -0.572718, 0.816712, 0.070540, +-1.002737, -4.987385, 15.402298, 0.000000, 0.484521, -0.576620, 0.807781, 0.122473, +-1.336982, -5.652997, 15.157051, 0.500000, 0.470545, -0.999903, -0.013895, -0.000479, +-1.336982, -5.652997, 15.157051, 0.500000, 0.470545, -0.999903, -0.013895, -0.000479, +-1.002737, -6.318611, 14.911804, 1.000000, 0.470545, -0.563019, -0.816504, -0.127790, +-1.002737, -6.733546, 18.459730, 1.000000, 0.261948, -0.564150, -0.822280, -0.074773, +-1.002737, -6.733546, 18.459730, 1.000000, 0.261948, -0.564150, -0.822280, -0.074773, +-1.002737, -6.957025, 21.947737, 1.000000, 0.047044, -0.566391, -0.823173, -0.039848, +-1.336982, -6.271589, 22.133167, 0.500000, 0.047044, -0.999991, -0.004281, 0.000323, +-1.336982, -6.271589, 22.133167, 0.500000, 0.047044, -0.999991, -0.004281, 0.000323, +-1.002737, -5.586154, 22.318600, 0.000000, 0.039374, -0.570604, 0.820419, 0.036373, +-1.002737, -5.379865, 18.885717, 0.000000, 0.261948, -0.572718, 0.816712, 0.070540, +-1.002737, -5.675372, 25.532089, 0.000000, -0.152521, -0.572885, 0.819555, 0.011471, +-1.002737, -5.586154, 22.318600, 0.000000, 0.039374, -0.570604, 0.820419, 0.036373, +-1.336982, -6.271589, 22.133167, 0.500000, 0.047044, -0.999991, -0.004281, 0.000323, +-1.336982, -6.271589, 22.133167, 0.500000, 0.047044, -0.999991, -0.004281, 0.000323, +-1.002737, -6.957025, 21.947737, 1.000000, 0.047044, -0.566391, -0.823173, -0.039848, +-1.002737, -7.059372, 25.207462, 1.000000, -0.152521, -0.565822, -0.824400, -0.014526, +-1.002737, -7.059372, 25.207462, 1.000000, -0.152521, -0.565822, -0.824400, -0.014526, +-1.002737, -7.074721, 28.664906, 1.000000, -0.338108, -0.564757, -0.825254, 0.002341, +-1.336982, -6.377152, 28.805500, 0.500000, -0.338108, -0.999930, -0.011845, 0.000045, +-1.336982, -6.377152, 28.805500, 0.500000, -0.338108, -0.999930, -0.011845, 0.000045, +-1.002737, -5.679584, 28.946095, 0.000000, -0.344415, -0.577055, 0.816690, -0.004975, +-1.002737, -5.675372, 25.532089, 0.000000, -0.152521, -0.572885, 0.819555, 0.011471, +-1.002737, -5.630855, 32.893612, 0.000000, -0.511082, -0.132943, 0.189166, -0.972904, +-1.002737, -5.679584, 28.946095, 0.000000, -0.344415, -0.577055, 0.816690, -0.004975, +-1.336982, -6.377152, 28.805500, 0.500000, -0.338108, -0.999930, -0.011845, 0.000045, +-1.336982, -6.377152, 28.805500, 0.500000, -0.338108, -0.999930, -0.011845, 0.000045, +-1.002737, -7.074721, 28.664906, 1.000000, -0.338108, -0.564757, -0.825254, 0.002341, +-1.002737, -7.037199, 32.893612, 1.000000, -0.511082, -0.140149, -0.202450, -0.969212, +-1.002737, -7.037199, 32.893612, 1.000000, -0.511082, -0.140149, -0.202450, -0.969212, +-4.193409, -10.256766, 32.893612, 1.027778, -0.557378, -0.685012, -0.716396, 0.132421, +-5.620958, -6.307936, 32.893612, 0.625000, -0.573582, -0.991757, -0.001005, 0.128133, +-5.620958, -6.307936, 32.893612, 0.625000, -0.573582, -0.991757, -0.001005, 0.128133, +-4.193409, -2.445326, 32.893612, 0.000000, -0.594415, -0.686924, 0.716419, 0.121978, +-1.002737, -5.630855, 32.893612, 0.000000, -0.511082, -0.132943, 0.189166, -0.972904, +-1.002737, -3.988198, 5.977939, 1.187500, 0.890530, -0.568961, -0.771457, -0.284847, +-1.002737, -3.239137, 4.110385, 1.000000, 1.000000, -0.573276, -0.760494, -0.304965, +0.000000, -3.446170, 3.992712, 1.500000, 1.000000, 0.000000, -0.928140, -0.372231, +0.000000, -3.446170, 3.992712, 1.500000, 1.000000, 0.000000, -0.928140, -0.372231, +1.002737, -3.239137, 4.110385, 2.000000, 1.000000, 0.573276, -0.760494, -0.304965, +1.002737, -3.988198, 5.977940, 2.000000, 0.908927, 0.568961, -0.771457, -0.284847, +1.002737, -3.988198, 5.977940, 2.000000, 0.908927, 0.568961, -0.771457, -0.284847, +1.002737, -4.824668, 8.406097, 2.000000, 0.798956, 0.564875, -0.790113, -0.237986, +0.000000, -5.037031, 8.300566, 1.500000, 0.798956, 0.000000, -0.957267, -0.289205, +0.000000, -5.037031, 8.300566, 1.500000, 0.798956, 0.000000, -0.957267, -0.289205, +-1.002737, -4.824668, 8.406097, 1.000000, 0.817855, -0.564875, -0.790113, -0.237986, +-1.002737, -3.988198, 5.977939, 1.187500, 0.890530, -0.568961, -0.771457, -0.284847, +-1.002737, -5.641894, 11.472322, 1.000000, 0.651188, -0.564280, -0.804601, -0.184946, +-1.002737, -4.824668, 8.406097, 1.000000, 0.817855, -0.564875, -0.790113, -0.237986, +0.000000, -5.037031, 8.300566, 1.500000, 0.798956, 0.000000, -0.957267, -0.289205, +0.000000, -5.037031, 8.300566, 1.500000, 0.798956, 0.000000, -0.957267, -0.289205, +1.002737, -4.824668, 8.406097, 2.000000, 0.798956, 0.564875, -0.790113, -0.237986, +1.002737, -5.641894, 11.472323, 2.000000, 0.651188, 0.564280, -0.804601, -0.184946, +1.002737, -5.641894, 11.472323, 2.000000, 0.651188, 0.564280, -0.804601, -0.184946, +1.002737, -6.318611, 14.911802, 2.000000, 0.470545, 0.563019, -0.816504, -0.127790, +0.000000, -6.540482, 14.830055, 1.500000, 0.470545, -0.000000, -0.987788, -0.155806, +0.000000, -6.540482, 14.830055, 1.500000, 0.470545, -0.000000, -0.987788, -0.155806, +-1.002737, -6.318611, 14.911804, 1.000000, 0.470545, -0.563019, -0.816504, -0.127790, +-1.002737, -5.641894, 11.472322, 1.000000, 0.651188, -0.564280, -0.804601, -0.184946, +-1.002737, -6.733546, 18.459730, 1.000000, 0.261948, -0.564150, -0.822280, -0.074773, +-1.002737, -6.318611, 14.911804, 1.000000, 0.470545, -0.563019, -0.816504, -0.127790, +0.000000, -6.540482, 14.830055, 1.500000, 0.470545, -0.000000, -0.987788, -0.155806, +0.000000, -6.540482, 14.830055, 1.500000, 0.470545, -0.000000, -0.987788, -0.155806, +1.002737, -6.318611, 14.911802, 2.000000, 0.470545, 0.563019, -0.816504, -0.127790, +1.002737, -6.733546, 18.459730, 2.000000, 0.261948, 0.564150, -0.822280, -0.074773, +1.002737, -6.733546, 18.459730, 2.000000, 0.261948, 0.564150, -0.822280, -0.074773, +1.002737, -6.957025, 21.947737, 2.000000, 0.047044, 0.566391, -0.823173, -0.039848, +0.000000, -7.185503, 21.885925, 1.500000, 0.047044, 0.000000, -0.998796, -0.049054, +0.000000, -7.185503, 21.885925, 1.500000, 0.047044, 0.000000, -0.998796, -0.049054, +-1.002737, -6.957025, 21.947737, 1.000000, 0.047044, -0.566391, -0.823173, -0.039848, +-1.002737, -6.733546, 18.459730, 1.000000, 0.261948, -0.564150, -0.822280, -0.074773, +-1.002737, -7.059372, 25.207462, 1.000000, -0.152521, -0.565822, -0.824400, -0.014526, +-1.002737, -6.957025, 21.947737, 1.000000, 0.047044, -0.566391, -0.823173, -0.039848, +0.000000, -7.185503, 21.885925, 1.500000, 0.047044, 0.000000, -0.998796, -0.049054, +0.000000, -7.185503, 21.885925, 1.500000, 0.047044, 0.000000, -0.998796, -0.049054, +1.002737, -6.957025, 21.947737, 2.000000, 0.047044, 0.566391, -0.823173, -0.039848, +1.002737, -7.059372, 25.207462, 2.000000, -0.152521, 0.565821, -0.824400, -0.014526, +1.002737, -7.059372, 25.207462, 2.000000, -0.152521, 0.565821, -0.824400, -0.014526, +1.002737, -7.074721, 28.664906, 2.000000, -0.338108, 0.564757, -0.825254, 0.002341, +0.000000, -7.307243, 28.618042, 1.500000, -0.338108, 0.000000, -0.999997, 0.002440, +0.000000, -7.307243, 28.618042, 1.500000, -0.338108, 0.000000, -0.999997, 0.002440, +-1.002737, -7.074721, 28.664906, 1.000000, -0.338108, -0.564757, -0.825254, 0.002341, +-1.002737, -7.059372, 25.207462, 1.000000, -0.152521, -0.565822, -0.824400, -0.014526, +-1.002737, -7.037199, 32.893612, 1.000000, -0.511082, -0.140149, -0.202450, -0.969212, +-1.002737, -7.074721, 28.664906, 1.000000, -0.338108, -0.564757, -0.825254, 0.002341, +0.000000, -7.307243, 28.618042, 1.500000, -0.338108, 0.000000, -0.999997, 0.002440, +0.000000, -7.307243, 28.618042, 1.500000, -0.338108, 0.000000, -0.999997, 0.002440, +1.002737, -7.074721, 28.664906, 2.000000, -0.338108, 0.564757, -0.825254, 0.002341, +1.002737, -7.037199, 32.893612, 2.000000, -0.511082, 0.140149, -0.202450, -0.969212, +1.002737, -7.037199, 32.893612, 2.000000, -0.511082, 0.140149, -0.202450, -0.969212, +4.193409, -10.256766, 32.893612, 1.972222, -0.557378, 0.680284, -0.725440, 0.104643, +0.000000, -11.548096, 32.893612, 1.500000, -0.573582, -0.004203, -0.998166, 0.060395, +0.000000, -11.548096, 32.893612, 1.500000, -0.573582, -0.004203, -0.998166, 0.060395, +-4.193409, -10.256766, 32.893612, 1.027778, -0.557378, -0.685012, -0.716396, 0.132421, +-1.002737, -7.037199, 32.893612, 1.000000, -0.511082, -0.140149, -0.202450, -0.969212, +1.002737, -3.988198, 5.977940, 2.000000, 0.908927, 0.568961, -0.771457, -0.284847, +1.002737, -3.239137, 4.110385, 2.000000, 1.000000, 0.573276, -0.760494, -0.304965, +1.336982, -2.618040, 4.463405, 2.500000, 1.000000, 0.999977, -0.006223, -0.002555, +1.336982, -2.618040, 4.463405, 2.500000, 1.000000, 0.999977, -0.006223, -0.002555, +1.002737, -1.996943, 4.816424, 3.000000, 1.000000, 0.580237, 0.756078, 0.302774, +1.002737, -2.734034, 6.657467, 3.000000, 0.908927, 0.582703, 0.762742, 0.280503, +1.002737, -2.734034, 6.657467, 3.000000, 0.908927, 0.582703, 0.762742, 0.280503, +1.002737, -3.550490, 9.039287, 3.000000, 0.798956, 0.582189, 0.779143, 0.232362, +1.336982, -4.187579, 8.722693, 2.500000, 0.798956, 0.999851, -0.016874, -0.003651, +1.336982, -4.187579, 8.722693, 2.500000, 0.798956, 0.999851, -0.016874, -0.003651, +1.002737, -4.824668, 8.406097, 2.000000, 0.798956, 0.564875, -0.790113, -0.237986, +1.002737, -3.988198, 5.977940, 2.000000, 0.908927, 0.568961, -0.771457, -0.284847, +1.002737, -5.641894, 11.472323, 2.000000, 0.651188, 0.564280, -0.804601, -0.184946, +1.002737, -4.824668, 8.406097, 2.000000, 0.798956, 0.564875, -0.790113, -0.237986, +1.336982, -4.187579, 8.722693, 2.500000, 0.798956, 0.999851, -0.016874, -0.003651, +1.336982, -4.187579, 8.722693, 2.500000, 0.798956, 0.999851, -0.016874, -0.003651, +1.002737, -3.550490, 9.039287, 3.000000, 0.798956, 0.582189, 0.779143, 0.232362, +1.002737, -4.339600, 12.037193, 3.000000, 0.651188, 0.578711, 0.795540, 0.179472, +1.002737, -4.339600, 12.037193, 3.000000, 0.651188, 0.578711, 0.795540, 0.179472, +1.002737, -4.987385, 15.402298, 3.000000, 0.470545, 0.576620, 0.807781, 0.122473, +1.336982, -5.652997, 15.157051, 2.500000, 0.470545, 0.999903, -0.013895, -0.000479, +1.336982, -5.652997, 15.157051, 2.500000, 0.470545, 0.999903, -0.013895, -0.000479, +1.002737, -6.318611, 14.911802, 2.000000, 0.470545, 0.563019, -0.816504, -0.127790, +1.002737, -5.641894, 11.472323, 2.000000, 0.651188, 0.564280, -0.804601, -0.184946, +1.002737, -6.733546, 18.459730, 2.000000, 0.261948, 0.564150, -0.822280, -0.074773, +1.002737, -6.318611, 14.911802, 2.000000, 0.470545, 0.563019, -0.816504, -0.127790, +1.336982, -5.652997, 15.157051, 2.500000, 0.470545, 0.999903, -0.013895, -0.000479, +1.336982, -5.652997, 15.157051, 2.500000, 0.470545, 0.999903, -0.013895, -0.000479, +1.002737, -4.987385, 15.402298, 3.000000, 0.470545, 0.576620, 0.807781, 0.122473, +1.002737, -5.379865, 18.885717, 3.000000, 0.261948, 0.572718, 0.816712, 0.070540, +1.002737, -5.379865, 18.885717, 3.000000, 0.261948, 0.572718, 0.816712, 0.070540, +1.002737, -5.586154, 22.318600, 3.000000, 0.047044, 0.570604, 0.820419, 0.036373, +1.336982, -6.271589, 22.133167, 2.500000, 0.047044, 0.999991, -0.004281, 0.000323, +1.336982, -6.271589, 22.133167, 2.500000, 0.047044, 0.999991, -0.004281, 0.000323, +1.002737, -6.957025, 21.947737, 2.000000, 0.047044, 0.566391, -0.823173, -0.039848, +1.002737, -6.733546, 18.459730, 2.000000, 0.261948, 0.564150, -0.822280, -0.074773, +1.002737, -7.059372, 25.207462, 2.000000, -0.152521, 0.565821, -0.824400, -0.014526, +1.002737, -6.957025, 21.947737, 2.000000, 0.047044, 0.566391, -0.823173, -0.039848, +1.336982, -6.271589, 22.133167, 2.500000, 0.047044, 0.999991, -0.004281, 0.000323, +1.336982, -6.271589, 22.133167, 2.500000, 0.047044, 0.999991, -0.004281, 0.000323, +1.002737, -5.586154, 22.318600, 3.000000, 0.047044, 0.570604, 0.820419, 0.036373, +1.002737, -5.675372, 25.532089, 3.000000, -0.152521, 0.572885, 0.819555, 0.011471, +1.002737, -5.675372, 25.532089, 3.000000, -0.152521, 0.572885, 0.819555, 0.011471, +1.002737, -5.679584, 28.946095, 3.000000, -0.338108, 0.577055, 0.816690, -0.004975, +1.336982, -6.377152, 28.805500, 2.500000, -0.338108, 0.999930, -0.011845, 0.000045, +1.336982, -6.377152, 28.805500, 2.500000, -0.338108, 0.999930, -0.011845, 0.000045, +1.002737, -7.074721, 28.664906, 2.000000, -0.338108, 0.564757, -0.825254, 0.002341, +1.002737, -7.059372, 25.207462, 2.000000, -0.152521, 0.565821, -0.824400, -0.014526, +1.002737, -7.037199, 32.893612, 2.000000, -0.511082, 0.140149, -0.202450, -0.969212, +1.002737, -7.074721, 28.664906, 2.000000, -0.338108, 0.564757, -0.825254, 0.002341, +1.336982, -6.377152, 28.805500, 2.500000, -0.338108, 0.999930, -0.011845, 0.000045, +1.336982, -6.377152, 28.805500, 2.500000, -0.338108, 0.999930, -0.011845, 0.000045, +1.002737, -5.679584, 28.946095, 3.000000, -0.338108, 0.577055, 0.816690, -0.004975, +1.002737, -5.630855, 32.893612, 3.000000, -0.511082, 0.132943, 0.189166, -0.972904, +1.002737, -5.630855, 32.893612, 3.000000, -0.511082, 0.132943, 0.189166, -0.972904, +4.193409, -2.445326, 32.893612, 3.000000, -0.594415, 0.682263, 0.725032, 0.094055, +5.620958, -6.307936, 32.893612, 2.375000, -0.573582, 0.996241, -0.000983, 0.086619, +5.620958, -6.307936, 32.893612, 2.375000, -0.573582, 0.996241, -0.000983, 0.086619, +4.193409, -10.256766, 32.893612, 1.972222, -0.557378, 0.680284, -0.725440, 0.104643, +1.002737, -7.037199, 32.893612, 2.000000, -0.511082, 0.140149, -0.202450, -0.969212, +-1.002737, -1.445931, 3.440848, 2.500000, -1.666667, -0.596303, 0.745197, 0.298504, +-1.002737, -1.996943, 4.816424, 3.000000, -1.666667, -0.580237, 0.756078, 0.302774, +0.000000, -1.789911, 4.934098, 3.000000, -1.833333, -0.000000, 0.928348, 0.371713, +0.000000, -1.789911, 4.934098, 3.000000, -1.833333, -0.000000, 0.928348, 0.371713, +1.002737, -1.996943, 4.816424, 3.000000, -2.000000, 0.580237, 0.756078, 0.302774, +1.002737, -1.445931, 3.440848, 2.500000, -2.000000, 0.596303, 0.745197, 0.298504, +1.002737, -2.734034, 6.657467, 3.000000, 0.908927, 0.582703, 0.762742, 0.280503, +1.002737, -1.996943, 4.816424, 3.000000, 1.000000, 0.580237, 0.756078, 0.302774, +0.000000, -1.789911, 4.934098, 3.500000, 1.000000, -0.000000, 0.928348, 0.371713, +0.000000, -1.789911, 4.934098, 3.500000, 1.000000, -0.000000, 0.928348, 0.371713, +-1.002737, -1.996943, 4.816424, 4.000000, 1.000000, -0.580237, 0.756078, 0.302774, +-1.002737, -2.734034, 6.657467, 4.000000, 0.908927, -0.582703, 0.762742, 0.280503, +-1.002737, -2.734034, 6.657467, 4.000000, 0.908927, -0.582703, 0.762742, 0.280503, +-1.002737, -3.550490, 9.039287, 4.000000, 0.817855, -0.582189, 0.779143, 0.232362, +0.000000, -3.338127, 9.144818, 3.500000, 0.798956, 0.000000, 0.958542, 0.284953, +0.000000, -3.338127, 9.144818, 3.500000, 0.798956, 0.000000, 0.958542, 0.284953, +1.002737, -3.550490, 9.039287, 3.000000, 0.798956, 0.582189, 0.779143, 0.232362, +1.002737, -2.734034, 6.657467, 3.000000, 0.908927, 0.582703, 0.762742, 0.280503, +1.002737, -4.339600, 12.037193, 3.000000, 0.651188, 0.578711, 0.795540, 0.179472, +1.002737, -3.550490, 9.039287, 3.000000, 0.798956, 0.582189, 0.779143, 0.232362, +0.000000, -3.338127, 9.144818, 3.500000, 0.798956, 0.000000, 0.958542, 0.284953, +0.000000, -3.338127, 9.144818, 3.500000, 0.798956, 0.000000, 0.958542, 0.284953, +-1.002737, -3.550490, 9.039287, 4.000000, 0.817855, -0.582189, 0.779143, 0.232362, +-1.002737, -4.339600, 12.037193, 4.000000, 0.651188, -0.578711, 0.795540, 0.179472, +-1.002737, -4.339600, 12.037193, 4.000000, 0.651188, -0.578711, 0.795540, 0.179472, +-1.002737, -4.987385, 15.402298, 4.000000, 0.484521, -0.576620, 0.807781, 0.122473, +0.000000, -4.765513, 15.484047, 3.500000, 0.470545, 0.000000, 0.988884, 0.148690, +0.000000, -4.765513, 15.484047, 3.500000, 0.470545, 0.000000, 0.988884, 0.148690, +1.002737, -4.987385, 15.402298, 3.000000, 0.470545, 0.576620, 0.807781, 0.122473, +1.002737, -4.339600, 12.037193, 3.000000, 0.651188, 0.578711, 0.795540, 0.179472, +1.002737, -5.379865, 18.885717, 3.000000, 0.261948, 0.572718, 0.816712, 0.070540, +1.002737, -4.987385, 15.402298, 3.000000, 0.470545, 0.576620, 0.807781, 0.122473, +0.000000, -4.765513, 15.484047, 3.500000, 0.470545, 0.000000, 0.988884, 0.148690, +0.000000, -4.765513, 15.484047, 3.500000, 0.470545, 0.000000, 0.988884, 0.148690, +-1.002737, -4.987385, 15.402298, 4.000000, 0.484521, -0.576620, 0.807781, 0.122473, +-1.002737, -5.379865, 18.885717, 4.000000, 0.261948, -0.572718, 0.816712, 0.070540, +-1.002737, -5.379865, 18.885717, 4.000000, 0.261948, -0.572718, 0.816712, 0.070540, +-1.002737, -5.586154, 22.318600, 4.000000, 0.039374, -0.570604, 0.820419, 0.036373, +0.000000, -5.357677, 22.380409, 3.500000, 0.047044, -0.000000, 0.999050, 0.043579, +0.000000, -5.357677, 22.380409, 3.500000, 0.047044, -0.000000, 0.999050, 0.043579, +1.002737, -5.586154, 22.318600, 3.000000, 0.047044, 0.570604, 0.820419, 0.036373, +1.002737, -5.379865, 18.885717, 3.000000, 0.261948, 0.572718, 0.816712, 0.070540, +1.002737, -5.675372, 25.532089, 3.000000, -0.152521, 0.572885, 0.819555, 0.011471, +1.002737, -5.586154, 22.318600, 3.000000, 0.047044, 0.570604, 0.820419, 0.036373, +0.000000, -5.357677, 22.380409, 3.500000, 0.047044, -0.000000, 0.999050, 0.043579, +0.000000, -5.357677, 22.380409, 3.500000, 0.047044, -0.000000, 0.999050, 0.043579, +-1.002737, -5.586154, 22.318600, 4.000000, 0.039374, -0.570604, 0.820419, 0.036373, +-1.002737, -5.675372, 25.532089, 4.000000, -0.152521, -0.572885, 0.819555, 0.011471, +-1.002737, -5.675372, 25.532089, 4.000000, -0.152521, -0.572885, 0.819555, 0.011471, +-1.002737, -5.679584, 28.946095, 4.000000, -0.344415, -0.577055, 0.816690, -0.004975, +0.000000, -5.447061, 28.992958, 3.500000, -0.338108, 0.000000, 0.999979, -0.006525, +0.000000, -5.447061, 28.992958, 3.500000, -0.338108, 0.000000, 0.999979, -0.006525, +1.002737, -5.679584, 28.946095, 3.000000, -0.338108, 0.577055, 0.816690, -0.004975, +1.002737, -5.675372, 25.532089, 3.000000, -0.152521, 0.572885, 0.819555, 0.011471, +1.002737, -5.630855, 32.893612, 3.000000, -0.511082, 0.132943, 0.189166, -0.972904, +1.002737, -5.679584, 28.946095, 3.000000, -0.338108, 0.577055, 0.816690, -0.004975, +0.000000, -5.447061, 28.992958, 3.500000, -0.338108, 0.000000, 0.999979, -0.006525, +0.000000, -5.447061, 28.992958, 3.500000, -0.338108, 0.000000, 0.999979, -0.006525, +-1.002737, -5.679584, 28.946095, 4.000000, -0.344415, -0.577055, 0.816690, -0.004975, +-1.002737, -5.630855, 32.893612, 4.000000, -0.511082, -0.132943, 0.189166, -0.972904, +-1.002737, -5.630855, 32.893612, 4.000000, -0.511082, -0.132943, 0.189166, -0.972904, +-4.193409, -2.445326, 32.893612, 4.000000, -0.594415, -0.686924, 0.716419, 0.121978, +0.000000, -1.067776, 32.893612, 3.500000, -0.594415, -0.004492, 0.998437, 0.055707, +0.000000, -1.067776, 32.893612, 3.500000, -0.594415, -0.004492, 0.998437, 0.055707, +4.193409, -2.445326, 32.893612, 3.000000, -0.594415, 0.682263, 0.725032, 0.094055, +1.002737, -5.630855, 32.893612, 3.000000, -0.511082, 0.132943, 0.189166, -0.972904, +-1.002737, -2.684134, 2.725971, 3.500000, -1.666667, -0.555812, -0.771611, -0.309336, +-1.002737, -3.239137, 4.110385, 4.000000, -1.666667, -0.573276, -0.760494, -0.304965, +-1.336982, -2.618040, 4.463405, 4.000000, -1.833333, -0.999977, -0.006223, -0.002555, +-1.336982, -2.618040, 4.463405, 4.000000, -1.833333, -0.999977, -0.006223, -0.002555, +-1.002737, -1.996943, 4.816424, 4.000000, -2.000000, -0.580237, 0.756078, 0.302774, +-1.002737, -1.445931, 3.440848, 3.500000, -2.000000, -0.596303, 0.745197, 0.298504, +1.002737, -2.684134, 2.725971, 4.500000, -1.666667, 0.555812, -0.771611, -0.309336, +1.002737, -3.239137, 4.110385, 5.000000, -1.666667, 0.573276, -0.760494, -0.304965, +0.000000, -3.446170, 3.992712, 5.000000, -1.833333, 0.000000, -0.928140, -0.372231, +0.000000, -3.446170, 3.992712, 5.000000, -1.833333, 0.000000, -0.928140, -0.372231, +-1.002737, -3.239137, 4.110385, 5.000000, -2.000000, -0.573276, -0.760494, -0.304965, +-1.002737, -2.684134, 2.725971, 4.500000, -2.000000, -0.555812, -0.771611, -0.309336, +-1.336982, -22.914524, -4.929887, 7.000000, -1.833333, -0.999805, -0.016666, 0.010584, +-1.002737, -22.289114, -5.237599, 7.000000, -1.666667, -0.580101, 0.726129, -0.369081, +-1.002737, -22.791559, -6.324653, 6.500000, -1.666667, -0.585182, 0.679392, -0.442706, +-1.002737, -22.791559, -6.324653, 6.500000, -1.666667, -0.585182, 0.679392, -0.442706, +-0.742768, -23.169422, -6.772669, 6.000000, -1.666667, -0.444774, 0.383424, -0.809421, +-1.002737, -23.736286, -6.771559, 6.000000, -1.833333, -0.633041, -0.276747, -0.722959, +-1.002737, -23.736286, -6.771559, 6.000000, -1.833333, -0.633041, -0.276747, -0.722959, +-0.742768, -24.152987, -6.401496, 6.000000, -2.000000, -0.455754, -0.834431, -0.309862, +-1.002737, -24.101816, -5.795360, 6.500000, -2.000000, -0.571338, -0.788867, 0.226409, +-1.002737, -24.101816, -5.795360, 6.500000, -2.000000, -0.571338, -0.788867, 0.226409, +-1.002737, -23.539934, -4.622173, 7.000000, -2.000000, -0.559738, -0.733607, 0.385376, +-1.336982, -22.914524, -4.929887, 7.000000, -1.833333, -0.999805, -0.016666, 0.010584, +-1.336982, -20.877926, -1.798224, 0.500000, 4.901888, -0.999242, -0.027513, 0.027552, +-1.002737, -20.362839, -2.232996, 1.000000, 4.901887, -0.577401, 0.607255, -0.545756, +-1.002737, -21.510138, -3.803390, 1.000000, 4.957545, -0.579339, 0.686160, -0.439944, +-1.002737, -21.510138, -3.803390, 1.000000, 4.957545, -0.579339, 0.686160, -0.439944, +-1.002737, -22.289114, -5.237599, 1.000000, 5.000000, -0.580101, 0.726129, -0.369081, +-1.336982, -22.914524, -4.929887, 0.500000, 5.000000, -0.999805, -0.016666, 0.010584, +-1.336982, -22.914524, -4.929887, 0.500000, 5.000000, -0.999805, -0.016666, 0.010584, +-1.002737, -23.539934, -4.622173, 0.000000, 5.000000, -0.559738, -0.733607, 0.385376, +-1.002737, -22.670450, -3.070609, 0.000000, 4.957545, -0.549531, -0.697669, 0.459646, +-1.002737, -22.670450, -3.070609, 0.000000, 4.957545, -0.549531, -0.697669, 0.459646, +-1.002737, -21.393009, -1.363454, 0.000000, 4.915090, -0.538985, -0.621423, 0.568620, +-1.336982, -20.877926, -1.798224, 0.500000, 4.901888, -0.999242, -0.027513, 0.027552, +-1.336982, -17.125900, 1.021948, 0.500000, 4.706708, -0.998755, -0.017888, 0.046575, +-1.002737, -16.806824, 0.450041, 1.000000, 4.706708, -0.570721, 0.333495, -0.750372, +-1.002737, -18.755436, -0.737389, 1.000000, 4.819824, -0.571841, 0.493951, -0.654989, +-1.002737, -18.755436, -0.737389, 1.000000, 4.819824, -0.571841, 0.493951, -0.654989, +-1.002737, -20.362839, -2.232996, 1.000000, 4.901887, -0.577401, 0.607255, -0.545756, +-1.336982, -20.877926, -1.798224, 0.500000, 4.901888, -0.999242, -0.027513, 0.027552, +-1.336982, -20.877926, -1.798224, 0.500000, 4.901888, -0.999242, -0.027513, 0.027552, +-1.002737, -21.393009, -1.363454, 0.000000, 4.915090, -0.538985, -0.621423, 0.568620, +-1.002737, -19.607264, 0.276508, 0.000000, 4.819824, -0.531663, -0.507888, 0.677779, +-1.002737, -19.607264, 0.276508, 0.000000, 4.819824, -0.531663, -0.507888, 0.677779, +-1.002737, -17.444981, 1.593854, 0.000000, 4.724558, -0.523473, -0.350048, 0.776815, +-1.336982, -17.125900, 1.021948, 0.500000, 4.706708, -0.998755, -0.017888, 0.046575, +-1.336982, -12.461710, 1.998980, 0.500000, 4.382352, -0.999581, -0.002143, 0.028884, +-1.002737, -12.384212, 1.352605, 1.000000, 4.382352, -0.556840, 0.051516, -0.829021, +-1.002737, -14.635897, 1.095908, 1.000000, 4.557891, -0.560822, 0.165222, -0.811283, +-1.002737, -14.635897, 1.095908, 1.000000, 4.557891, -0.560822, 0.165222, -0.811283, +-1.002737, -16.806824, 0.450041, 1.000000, 4.706708, -0.570721, 0.333495, -0.750372, +-1.336982, -17.125900, 1.021948, 0.500000, 4.706708, -0.998755, -0.017888, 0.046575, +-1.336982, -17.125900, 1.021948, 0.500000, 4.706708, -0.998755, -0.017888, 0.046575, +-1.002737, -17.444981, 1.593854, 0.000000, 4.724558, -0.523473, -0.350048, 0.776815, +-1.002737, -15.037928, 2.333167, 0.000000, 4.557892, -0.524224, -0.178780, 0.832603, +-1.002737, -15.037928, 2.333167, 0.000000, 4.557892, -0.524224, -0.178780, 0.832603, +-1.002737, -12.539209, 2.645355, 0.000000, 4.391225, -0.529316, -0.059790, 0.846315, +-1.336982, -12.461710, 1.998980, 0.500000, 4.382352, -0.999581, -0.002143, 0.028884, +-1.336982, -8.028582, 1.726443, 0.500000, 3.977933, -0.998903, 0.011916, 0.045285, +-1.002737, -8.188779, 1.086162, 1.000000, 3.977933, -0.571796, -0.203921, -0.794648, +-1.002737, -10.193326, 1.372527, 1.000000, 4.189068, -0.563923, -0.052320, -0.824168, +-1.002737, -10.193326, 1.372527, 1.000000, 4.189068, -0.563923, -0.052320, -0.824168, +-1.002737, -12.384212, 1.352605, 1.000000, 4.382352, -0.556840, 0.051516, -0.829021, +-1.336982, -12.461710, 1.998980, 0.500000, 4.382352, -0.999581, -0.002143, 0.028884, +-1.336982, -12.461710, 1.998980, 0.500000, 4.382352, -0.999581, -0.002143, 0.028884, +-1.002737, -12.539209, 2.645355, 0.000000, 4.391225, -0.529316, -0.059790, 0.846315, +-1.002737, -10.101929, 2.681329, 0.000000, 4.189068, -0.529646, 0.050516, 0.846713, +-1.002737, -10.101929, 2.681329, 0.000000, 4.189068, -0.529646, 0.050516, 0.846713, +-1.002737, -7.868385, 2.366725, 0.000000, 3.986911, -0.526810, 0.210598, 0.823480, +-1.336982, -8.028582, 1.726443, 0.500000, 3.977933, -0.998903, 0.011916, 0.045285, +-1.336982, -4.681401, -0.053863, 0.500000, 3.518014, -0.999076, 0.030579, 0.030219, +-1.002737, -5.023273, -0.595701, 1.000000, 3.518014, -0.554291, -0.537252, -0.635706, +-1.002737, -6.496116, 0.423996, 1.000000, 3.748844, -0.567467, -0.386666, -0.726960, +-1.002737, -6.496116, 0.423996, 1.000000, 3.748844, -0.567467, -0.386666, -0.726960, +-1.002737, -8.188779, 1.086162, 1.000000, 3.977933, -0.571796, -0.203921, -0.794648, +-1.336982, -8.028582, 1.726443, 0.500000, 3.977933, -0.998903, 0.011916, 0.045285, +-1.336982, -8.028582, 1.726443, 0.500000, 3.977933, -0.998903, 0.011916, 0.045285, +-1.002737, -7.868385, 2.366725, 0.000000, 3.986911, -0.526810, 0.210598, 0.823480, +-1.002737, -5.980879, 1.627182, 0.000000, 3.748844, -0.522694, 0.400366, 0.752661, +-1.002737, -5.980879, 1.627182, 0.000000, 3.748844, -0.522694, 0.400366, 0.752661, +-1.002737, -4.339529, 0.487975, 0.000000, 3.510776, -0.515414, 0.553092, 0.654552, +-1.336982, -4.681401, -0.053863, 0.500000, 3.518014, -0.999076, 0.030579, 0.030219, +-1.336982, -2.032626, -3.152671, 0.500000, 3.096704, -0.999446, 0.028671, 0.016899, +-1.002737, -2.514818, -3.530164, 1.000000, 3.096704, -0.535283, -0.710141, -0.457353, +-1.002737, -3.678185, -1.954659, 1.000000, 3.301661, -0.541786, -0.639146, -0.545858, +-1.002737, -3.678185, -1.954659, 1.000000, 3.301661, -0.541786, -0.639146, -0.545858, +-1.002737, -5.023273, -0.595701, 1.000000, 3.518014, -0.554291, -0.537252, -0.635706, +-1.336982, -4.681401, -0.053863, 0.500000, 3.518014, -0.999076, 0.030579, 0.030219, +-1.336982, -4.681401, -0.053863, 0.500000, 3.518014, -0.999076, 0.030579, 0.030219, +-1.002737, -4.339529, 0.487975, 0.000000, 3.510776, -0.515414, 0.553092, 0.654552, +-1.002737, -2.844458, -1.025621, 0.000000, 3.301661, -0.509526, 0.653879, 0.559309, +-1.002737, -2.844458, -1.025621, 0.000000, 3.301661, -0.509526, 0.653879, 0.559309, +-1.002737, -1.550434, -2.775177, 0.000000, 3.092546, -0.505987, 0.723592, 0.469458, +-1.336982, -2.032626, -3.152671, 0.500000, 3.096704, -0.999446, 0.028671, 0.016899, +-1.336982, -0.371475, -6.820555, 0.500000, 2.714038, -0.999078, 0.041649, 0.010372, +-1.002737, -0.955311, -7.018215, 1.000000, 2.714038, -0.543592, -0.816934, -0.192683, +-1.002737, -1.587135, -5.199499, 1.000000, 2.900065, -0.538039, -0.769598, -0.343850, +-1.002737, -1.587135, -5.199499, 1.000000, 2.900065, -0.538039, -0.769598, -0.343850, +-1.002737, -2.514818, -3.530164, 1.000000, 3.096704, -0.535283, -0.710141, -0.457353, +-1.336982, -2.032626, -3.152671, 0.500000, 3.096704, -0.999446, 0.028671, 0.016899, +-1.336982, -2.032626, -3.152671, 0.500000, 3.096704, -0.999446, 0.028671, 0.016899, +-1.002737, -1.550434, -2.775177, 0.000000, 3.092546, -0.505987, 0.723592, 0.469458, +-1.002737, -0.512230, -4.622262, 0.000000, 2.900065, -0.503207, 0.785550, 0.360132, +-1.002737, -0.512230, -4.622262, 0.000000, 2.900065, -0.503207, 0.785550, 0.360132, +-1.002737, 0.212360, -6.622896, 0.000000, 2.707584, -0.505652, 0.835716, 0.214230, +-1.336982, -0.371475, -6.820555, 0.500000, 2.714038, -0.999078, 0.041649, 0.010372, +-1.336982, -0.183937, -11.115767, 0.500000, 2.371212, -0.999002, 0.043336, -0.010816, +-1.002737, -0.835270, -11.133001, 1.000000, 2.371212, -0.556778, -0.814518, 0.162970, +-1.002737, -0.679522, -9.041862, 1.000000, 2.540917, -0.550509, -0.834486, -0.023924, +-1.002737, -0.679522, -9.041862, 1.000000, 2.540917, -0.550509, -0.834486, -0.023924, +-1.002737, -0.955311, -7.018215, 1.000000, 2.714038, -0.543592, -0.816934, -0.192683, +-1.336982, -0.371475, -6.820555, 0.500000, 2.714038, -0.999078, 0.041649, 0.010372, +-1.336982, -0.371475, -6.820555, 0.500000, 2.714038, -0.999078, 0.041649, 0.010372, +-1.002737, 0.212360, -6.622896, 0.000000, 2.707584, -0.505652, 0.835716, 0.214230, +-1.002737, 0.565540, -8.833092, 0.000000, 2.540917, -0.512670, 0.857167, 0.049331, +-1.002737, 0.565540, -8.833092, 0.000000, 2.540917, -0.512670, 0.857167, 0.049331, +-1.002737, 0.467394, -11.098533, 0.000000, 2.374251, -0.517497, 0.844529, -0.137721, +-1.336982, -0.183937, -11.115767, 0.500000, 2.371212, -0.999002, 0.043336, -0.010816, +-1.336982, -1.762512, -15.300098, 0.500000, 2.020624, -0.999977, 0.006790, -0.000522, +-1.002737, -2.439466, -15.191065, 1.000000, 2.020624, -0.552162, -0.756555, 0.350343, +-1.002737, -1.498060, -13.154191, 1.000000, 2.195430, -0.550846, -0.775955, 0.307348, +-1.002737, -1.498060, -13.154191, 1.000000, 2.195430, -0.550846, -0.775955, 0.307348, +-1.002737, -0.835270, -11.133001, 1.000000, 2.371212, -0.556778, -0.814518, 0.162970, +-1.336982, -0.183937, -11.115767, 0.500000, 2.371212, -0.999002, 0.043336, -0.010816, +-1.336982, -0.183937, -11.115767, 0.500000, 2.371212, -0.999002, 0.043336, -0.010816, +-1.002737, 0.467394, -11.098533, 0.000000, 2.374251, -0.517497, 0.844529, -0.137721, +-1.002737, -0.161999, -13.264900, 0.000000, 2.195430, -0.528455, 0.798898, -0.287224, +-1.002737, -0.161999, -13.264900, 0.000000, 2.195430, -0.528455, 0.798898, -0.287224, +-1.002737, -1.085560, -15.409132, 0.000000, 2.016609, -0.545979, 0.767296, -0.336399, +-1.336982, -1.762512, -15.300098, 0.500000, 2.020624, -0.999977, 0.006790, -0.000522, +-1.336982, -3.677238, -19.700720, 0.500000, 1.696742, -0.999943, -0.009227, 0.005371, +-1.002737, -4.363696, -19.552979, 1.000000, 1.696742, -0.563275, -0.773529, 0.290474, +-1.002737, -3.431055, -17.329250, 1.000000, 1.853850, -0.559291, -0.758482, 0.334513, +-1.002737, -3.431055, -17.329250, 1.000000, 1.853850, -0.559291, -0.758482, 0.334513, +-1.002737, -2.439466, -15.191065, 1.000000, 2.020624, -0.552162, -0.756555, 0.350343, +-1.336982, -1.762512, -15.300098, 0.500000, 2.020624, -0.999977, 0.006790, -0.000522, +-1.336982, -1.762512, -15.300098, 0.500000, 2.020624, -0.999977, 0.006790, -0.000522, +-1.002737, -1.085560, -15.409132, 0.000000, 2.016609, -0.545979, 0.767296, -0.336399, +-1.002737, -2.066217, -17.608171, 0.000000, 1.853850, -0.561407, 0.760416, -0.326481, +-1.002737, -2.066217, -17.608171, 0.000000, 1.853850, -0.561407, 0.760416, -0.326481, +-1.002737, -2.990782, -19.848455, 0.000000, 1.691091, -0.573541, 0.767562, -0.286181, +-1.336982, -3.677238, -19.700720, 0.500000, 1.696742, -0.999943, -0.009227, 0.005371, +-1.336982, -4.998410, -24.141369, 0.500000, 1.417808, -0.999879, -0.015054, 0.003873, +-1.002737, -5.694758, -24.033106, 1.000000, 1.417808, -0.566494, -0.804616, 0.177981, +-1.002737, -5.128252, -21.846479, 1.000000, 1.550938, -0.566340, -0.790066, 0.234638, +-1.002737, -5.128252, -21.846479, 1.000000, 1.550938, -0.566340, -0.790066, 0.234638, +-1.002737, -4.363696, -19.552979, 1.000000, 1.696742, -0.563275, -0.773529, 0.290474, +-1.336982, -3.677238, -19.700720, 0.500000, 1.696742, -0.999943, -0.009227, 0.005371, +-1.336982, -3.677238, -19.700720, 0.500000, 1.696742, -0.999943, -0.009227, 0.005371, +-1.002737, -2.990782, -19.848455, 0.000000, 1.691091, -0.573541, 0.767562, -0.286181, +-1.002737, -3.746061, -22.116426, 0.000000, 1.550938, -0.578794, 0.781497, -0.232937, +-1.002737, -3.746061, -22.116426, 0.000000, 1.550938, -0.578794, 0.781497, -0.232937, +-1.002737, -4.302059, -24.249632, 0.000000, 1.410785, -0.582444, 0.793471, -0.176531, +-1.336982, -4.998410, -24.141369, 0.500000, 1.417808, -0.999879, -0.015054, 0.003873, +-1.336982, -5.505962, -27.491592, 0.500000, 1.186658, -0.999932, -0.011525, 0.001722, +-1.002737, -6.213656, -27.449341, 1.000000, 1.186658, -0.570758, -0.816393, 0.087968, +-1.002737, -6.033253, -25.936214, 1.000000, 1.298722, -0.568446, -0.813396, 0.123515, +-1.002737, -6.033253, -25.936214, 1.000000, 1.298722, -0.568446, -0.813396, 0.123515, +-1.002737, -5.694758, -24.033106, 1.000000, 1.417808, -0.566494, -0.804616, 0.177981, +-1.336982, -4.998410, -24.141369, 0.500000, 1.417808, -0.999879, -0.015054, 0.003873, +-1.336982, -4.998410, -24.141369, 0.500000, 1.417808, -0.999879, -0.015054, 0.003873, +-1.002737, -4.302059, -24.249632, 0.000000, 1.410785, -0.582444, 0.793471, -0.176531, +-1.002737, -4.628780, -26.085621, 0.000000, 1.298722, -0.582983, 0.803361, -0.121414, +-1.002737, -4.628780, -26.085621, 0.000000, 1.298722, -0.582983, 0.803361, -0.121414, +-1.002737, -4.798269, -27.533844, 0.000000, 1.186658, -0.583018, 0.808019, -0.084825, +-1.336982, -5.505962, -27.491592, 0.500000, 1.186658, -0.999932, -0.011525, 0.001722, +-1.002737, -6.305892, -28.466030, 0.500000, 1.053028, -0.565626, -0.821288, 0.074517, +-1.002737, -6.213656, -27.449341, 1.000000, 1.053028, -0.570758, -0.816393, 0.087968, +-1.336982, -5.505962, -27.491592, 1.000000, 1.119843, -0.999932, -0.011525, 0.001722, +-1.336982, -5.505962, -27.491592, 1.000000, 1.119843, -0.999932, -0.011525, 0.001722, +-1.002737, -4.798269, -27.533844, 1.000000, 1.186658, -0.583018, 0.808019, -0.084825, +-1.002737, -4.882575, -28.503754, 0.500000, 1.186658, -0.589040, 0.805068, -0.069986, +0.000000, -22.080643, -5.340171, 1.000000, 1.026514, 0.000000, 0.892013, -0.452009, +1.002737, -22.289114, -5.237599, 1.000000, 1.053028, 0.580101, 0.726128, -0.369081, +1.002737, -22.791559, -6.324653, 0.500000, 1.053028, 0.585182, 0.679392, -0.442706, +1.002737, -22.791559, -6.324653, 0.500000, 1.053028, 0.585182, 0.679392, -0.442706, +0.742768, -23.169422, -6.772669, 0.000000, 1.053028, 0.444774, 0.383425, -0.809421, +0.000000, -23.066525, -7.012697, 0.000000, 1.026514, -0.000000, 0.424976, -0.905205, +0.000000, -23.066525, -7.012697, 0.000000, 1.026514, -0.000000, 0.424976, -0.905205, +-0.742768, -23.169422, -6.772669, 0.000000, 1.000000, -0.444774, 0.383424, -0.809421, +-1.002737, -22.791559, -6.324653, 0.500000, 1.000000, -0.585182, 0.679392, -0.442706, +-1.002737, -22.791559, -6.324653, 0.500000, 1.000000, -0.585182, 0.679392, -0.442706, +-1.002737, -22.289114, -5.237599, 1.000000, 1.000000, -0.580101, 0.726129, -0.369081, +0.000000, -22.080643, -5.340171, 1.000000, 1.026514, 0.000000, 0.892013, -0.452009, +0.000000, -20.191145, -2.377919, 1.500000, 4.901888, 0.000000, 0.744223, -0.667931, +1.002737, -20.362839, -2.232996, 2.000000, 4.901887, 0.577401, 0.607255, -0.545756, +1.002737, -21.510138, -3.803390, 2.000000, 4.957545, 0.579339, 0.686160, -0.439944, +1.002737, -21.510138, -3.803390, 2.000000, 4.957545, 0.579339, 0.686160, -0.439944, +1.002737, -22.289114, -5.237599, 2.000000, 5.000000, 0.580101, 0.726128, -0.369081, +0.000000, -22.080643, -5.340171, 1.500000, 5.000000, 0.000000, 0.892013, -0.452009, +0.000000, -22.080643, -5.340171, 1.500000, 5.000000, 0.000000, 0.892013, -0.452009, +-1.002737, -22.289114, -5.237599, 1.000000, 5.000000, -0.580101, 0.726129, -0.369081, +-1.002737, -21.510138, -3.803390, 1.000000, 4.957545, -0.579339, 0.686160, -0.439944, +-1.002737, -21.510138, -3.803390, 1.000000, 4.957545, -0.579339, 0.686160, -0.439944, +-1.002737, -20.362839, -2.232996, 1.000000, 4.901887, -0.577401, 0.607255, -0.545756, +0.000000, -20.191145, -2.377919, 1.500000, 4.901888, 0.000000, 0.744223, -0.667931, +0.000000, -16.700464, 0.259406, 1.500000, 4.706708, -0.000000, 0.404784, -0.914412, +1.002737, -16.806824, 0.450041, 2.000000, 4.706708, 0.570721, 0.333495, -0.750372, +1.002737, -18.755436, -0.737389, 2.000000, 4.819824, 0.571841, 0.493951, -0.654989, +1.002737, -18.755436, -0.737389, 2.000000, 4.819824, 0.571841, 0.493951, -0.654989, +1.002737, -20.362839, -2.232996, 2.000000, 4.901887, 0.577401, 0.607255, -0.545756, +0.000000, -20.191145, -2.377919, 1.500000, 4.901888, 0.000000, 0.744223, -0.667931, +0.000000, -20.191145, -2.377919, 1.500000, 4.901888, 0.000000, 0.744223, -0.667931, +-1.002737, -20.362839, -2.232996, 1.000000, 4.901887, -0.577401, 0.607255, -0.545756, +-1.002737, -18.755436, -0.737389, 1.000000, 4.819824, -0.571841, 0.493951, -0.654989, +-1.002737, -18.755436, -0.737389, 1.000000, 4.819824, -0.571841, 0.493951, -0.654989, +-1.002737, -16.806824, 0.450041, 1.000000, 4.706708, -0.570721, 0.333495, -0.750372, +0.000000, -16.700464, 0.259406, 1.500000, 4.706708, -0.000000, 0.404784, -0.914412, +0.000000, -12.358379, 1.137146, 1.500000, 4.382352, 0.000000, 0.060964, -0.998140, +1.002737, -12.384212, 1.352605, 2.000000, 4.382352, 0.556840, 0.051516, -0.829021, +1.002737, -14.635897, 1.095908, 2.000000, 4.557891, 0.560822, 0.165222, -0.811283, +1.002737, -14.635897, 1.095908, 2.000000, 4.557891, 0.560822, 0.165222, -0.811283, +1.002737, -16.806824, 0.450041, 2.000000, 4.706708, 0.570721, 0.333495, -0.750372, +0.000000, -16.700464, 0.259406, 1.500000, 4.706708, -0.000000, 0.404784, -0.914412, +0.000000, -16.700464, 0.259406, 1.500000, 4.706708, -0.000000, 0.404784, -0.914412, +-1.002737, -16.806824, 0.450041, 1.000000, 4.706708, -0.570721, 0.333495, -0.750372, +-1.002737, -14.635897, 1.095908, 1.000000, 4.557891, -0.560822, 0.165222, -0.811283, +-1.002737, -14.635897, 1.095908, 1.000000, 4.557891, -0.560822, 0.165222, -0.811283, +-1.002737, -12.384212, 1.352605, 1.000000, 4.382352, -0.556840, 0.051516, -0.829021, +0.000000, -12.358379, 1.137146, 1.500000, 4.382352, 0.000000, 0.060964, -0.998140, +0.000000, -8.242178, 0.872734, 1.500000, 3.977933, 0.000000, -0.248755, -0.968567, +1.002737, -8.188779, 1.086162, 2.000000, 3.977933, 0.571796, -0.203921, -0.794648, +1.002737, -10.193325, 1.372527, 2.000000, 4.189068, 0.563923, -0.052320, -0.824168, +1.002737, -10.193325, 1.372527, 2.000000, 4.189068, 0.563923, -0.052320, -0.824168, +1.002737, -12.384212, 1.352605, 2.000000, 4.382352, 0.556840, 0.051516, -0.829021, +0.000000, -12.358379, 1.137146, 1.500000, 4.382352, 0.000000, 0.060964, -0.998140, +0.000000, -12.358379, 1.137146, 1.500000, 4.382352, 0.000000, 0.060964, -0.998140, +-1.002737, -12.384212, 1.352605, 1.000000, 4.382352, -0.556840, 0.051516, -0.829021, +-1.002737, -10.193326, 1.372527, 1.000000, 4.189068, -0.563923, -0.052320, -0.824168, +-1.002737, -10.193326, 1.372527, 1.000000, 4.189068, -0.563923, -0.052320, -0.824168, +-1.002737, -8.188779, 1.086162, 1.000000, 3.977933, -0.571796, -0.203921, -0.794648, +0.000000, -8.242178, 0.872734, 1.500000, 3.977933, 0.000000, -0.248755, -0.968567, +0.000000, -5.137229, -0.776313, 1.500000, 3.518014, -0.000000, -0.646205, -0.763164, +1.002737, -5.023273, -0.595701, 2.000000, 3.518014, 0.554291, -0.537252, -0.635706, +1.002737, -6.496116, 0.423996, 2.000000, 3.748844, 0.567467, -0.386666, -0.726960, +1.002737, -6.496116, 0.423996, 2.000000, 3.748844, 0.567467, -0.386666, -0.726960, +1.002737, -8.188779, 1.086162, 2.000000, 3.977933, 0.571796, -0.203921, -0.794648, +0.000000, -8.242178, 0.872734, 1.500000, 3.977933, 0.000000, -0.248755, -0.968567, +0.000000, -8.242178, 0.872734, 1.500000, 3.977933, 0.000000, -0.248755, -0.968567, +-1.002737, -8.188779, 1.086162, 1.000000, 3.977933, -0.571796, -0.203921, -0.794648, +-1.002737, -6.496116, 0.423996, 1.000000, 3.748844, -0.567467, -0.386666, -0.726960, +-1.002737, -6.496116, 0.423996, 1.000000, 3.748844, -0.567467, -0.386666, -0.726960, +-1.002737, -5.023273, -0.595701, 1.000000, 3.518014, -0.554291, -0.537252, -0.635706, +0.000000, -5.137229, -0.776313, 1.500000, 3.518014, -0.000000, -0.646205, -0.763164, +0.000000, -2.675549, -3.655995, 1.500000, 3.096704, -0.000000, -0.841132, -0.540830, +1.002737, -2.514818, -3.530164, 2.000000, 3.096704, 0.535283, -0.710141, -0.457354, +1.002737, -3.678185, -1.954659, 2.000000, 3.301661, 0.541785, -0.639146, -0.545858, +1.002737, -3.678185, -1.954659, 2.000000, 3.301661, 0.541785, -0.639146, -0.545858, +1.002737, -5.023273, -0.595701, 2.000000, 3.518014, 0.554291, -0.537252, -0.635706, +0.000000, -5.137229, -0.776313, 1.500000, 3.518014, -0.000000, -0.646205, -0.763164, +0.000000, -5.137229, -0.776313, 1.500000, 3.518014, -0.000000, -0.646205, -0.763164, +-1.002737, -5.023273, -0.595701, 1.000000, 3.518014, -0.554291, -0.537252, -0.635706, +-1.002737, -3.678185, -1.954659, 1.000000, 3.301661, -0.541786, -0.639146, -0.545858, +-1.002737, -3.678185, -1.954659, 1.000000, 3.301661, -0.541786, -0.639146, -0.545858, +-1.002737, -2.514818, -3.530164, 1.000000, 3.096704, -0.535283, -0.710141, -0.457353, +0.000000, -2.675549, -3.655995, 1.500000, 3.096704, -0.000000, -0.841132, -0.540830, +0.000000, -1.149923, -7.084101, 1.500000, 2.714038, 0.000000, -0.973883, -0.227050, +1.002737, -0.955311, -7.018215, 2.000000, 2.714038, 0.543591, -0.816934, -0.192683, +1.002737, -1.587135, -5.199499, 2.000000, 2.900065, 0.538039, -0.769598, -0.343850, +1.002737, -1.587135, -5.199499, 2.000000, 2.900065, 0.538039, -0.769598, -0.343850, +1.002737, -2.514818, -3.530164, 2.000000, 3.096704, 0.535283, -0.710141, -0.457354, +0.000000, -2.675549, -3.655995, 1.500000, 3.096704, -0.000000, -0.841132, -0.540830, +0.000000, -2.675549, -3.655995, 1.500000, 3.096704, -0.000000, -0.841132, -0.540830, +-1.002737, -2.514818, -3.530164, 1.000000, 3.096704, -0.535283, -0.710141, -0.457353, +-1.002737, -1.587135, -5.199499, 1.000000, 2.900065, -0.538039, -0.769598, -0.343850, +-1.002737, -1.587135, -5.199499, 1.000000, 2.900065, -0.538039, -0.769598, -0.343850, +-1.002737, -0.955311, -7.018215, 1.000000, 2.714038, -0.543592, -0.816934, -0.192683, +0.000000, -1.149923, -7.084101, 1.500000, 2.714038, 0.000000, -0.973883, -0.227050, +0.000000, -1.052381, -11.138744, 1.500000, 2.371212, 0.000000, -0.979438, 0.201745, +1.002737, -0.835270, -11.133000, 2.000000, 2.371212, 0.556778, -0.814518, 0.162970, +1.002737, -0.679521, -9.041862, 2.000000, 2.540917, 0.550509, -0.834486, -0.023924, +1.002737, -0.679521, -9.041862, 2.000000, 2.540917, 0.550509, -0.834486, -0.023924, +1.002737, -0.955311, -7.018215, 2.000000, 2.714038, 0.543591, -0.816934, -0.192683, +0.000000, -1.149923, -7.084101, 1.500000, 2.714038, 0.000000, -0.973883, -0.227050, +0.000000, -1.149923, -7.084101, 1.500000, 2.714038, 0.000000, -0.973883, -0.227050, +-1.002737, -0.955311, -7.018215, 1.000000, 2.714038, -0.543592, -0.816934, -0.192683, +-1.002737, -0.679522, -9.041862, 1.000000, 2.540917, -0.550509, -0.834486, -0.023924, +-1.002737, -0.679522, -9.041862, 1.000000, 2.540917, -0.550509, -0.834486, -0.023924, +-1.002737, -0.835270, -11.133001, 1.000000, 2.371212, -0.556778, -0.814518, 0.162970, +0.000000, -1.052381, -11.138744, 1.500000, 2.371212, 0.000000, -0.979438, 0.201745, +0.000000, -2.665116, -15.154720, 1.500000, 2.020624, -0.000000, -0.906717, 0.421740, +1.002737, -2.439466, -15.191065, 2.000000, 2.020624, 0.552162, -0.756556, 0.350343, +1.002737, -1.498060, -13.154191, 2.000000, 2.195430, 0.550846, -0.775955, 0.307348, +1.002737, -1.498060, -13.154191, 2.000000, 2.195430, 0.550846, -0.775955, 0.307348, +1.002737, -0.835270, -11.133000, 2.000000, 2.371212, 0.556778, -0.814518, 0.162970, +0.000000, -1.052381, -11.138744, 1.500000, 2.371212, 0.000000, -0.979438, 0.201745, +0.000000, -1.052381, -11.138744, 1.500000, 2.371212, 0.000000, -0.979438, 0.201745, +-1.002737, -0.835270, -11.133001, 1.000000, 2.371212, -0.556778, -0.814518, 0.162970, +-1.002737, -1.498060, -13.154191, 1.000000, 2.195430, -0.550846, -0.775955, 0.307348, +-1.002737, -1.498060, -13.154191, 1.000000, 2.195430, -0.550846, -0.775955, 0.307348, +-1.002737, -2.439466, -15.191065, 1.000000, 2.020624, -0.552162, -0.756555, 0.350343, +0.000000, -2.665116, -15.154720, 1.500000, 2.020624, -0.000000, -0.906717, 0.421740, +0.000000, -4.592515, -19.503733, 1.500000, 1.696742, -0.000000, -0.936315, 0.351162, +1.002737, -4.363696, -19.552979, 2.000000, 1.696742, 0.563275, -0.773529, 0.290474, +1.002737, -3.431055, -17.329250, 2.000000, 1.853850, 0.559291, -0.758482, 0.334513, +1.002737, -3.431055, -17.329250, 2.000000, 1.853850, 0.559291, -0.758482, 0.334513, +1.002737, -2.439466, -15.191065, 2.000000, 2.020624, 0.552162, -0.756556, 0.350343, +0.000000, -2.665116, -15.154720, 1.500000, 2.020624, -0.000000, -0.906717, 0.421740, +0.000000, -2.665116, -15.154720, 1.500000, 2.020624, -0.000000, -0.906717, 0.421740, +-1.002737, -2.439466, -15.191065, 1.000000, 2.020624, -0.552162, -0.756555, 0.350343, +-1.002737, -3.431055, -17.329250, 1.000000, 1.853850, -0.559291, -0.758482, 0.334513, +-1.002737, -3.431055, -17.329250, 1.000000, 1.853850, -0.559291, -0.758482, 0.334513, +-1.002737, -4.363696, -19.552979, 1.000000, 1.696742, -0.563275, -0.773529, 0.290474, +0.000000, -4.592515, -19.503733, 1.500000, 1.696742, -0.000000, -0.936315, 0.351162, +0.000000, -5.926875, -23.997019, 1.500000, 1.417808, -0.000000, -0.976472, 0.215645, +1.002737, -5.694758, -24.033106, 2.000000, 1.417808, 0.566494, -0.804616, 0.177981, +1.002737, -5.128252, -21.846479, 2.000000, 1.550938, 0.566340, -0.790066, 0.234638, +1.002737, -5.128252, -21.846479, 2.000000, 1.550938, 0.566340, -0.790066, 0.234638, +1.002737, -4.363696, -19.552979, 2.000000, 1.696742, 0.563275, -0.773529, 0.290474, +0.000000, -4.592515, -19.503733, 1.500000, 1.696742, -0.000000, -0.936315, 0.351162, +0.000000, -4.592515, -19.503733, 1.500000, 1.696742, -0.000000, -0.936315, 0.351162, +-1.002737, -4.363696, -19.552979, 1.000000, 1.696742, -0.563275, -0.773529, 0.290474, +-1.002737, -5.128252, -21.846479, 1.000000, 1.550938, -0.566340, -0.790066, 0.234638, +-1.002737, -5.128252, -21.846479, 1.000000, 1.550938, -0.566340, -0.790066, 0.234638, +-1.002737, -5.694758, -24.033106, 1.000000, 1.417808, -0.566494, -0.804616, 0.177981, +0.000000, -5.926875, -23.997019, 1.500000, 1.417808, -0.000000, -0.976472, 0.215645, +0.000000, -6.449554, -27.435261, 1.500000, 1.186658, -0.000000, -0.994229, 0.107280, +1.002737, -6.213656, -27.449341, 2.000000, 1.186658, 0.570758, -0.816393, 0.087968, +1.002737, -6.033253, -25.936216, 2.000000, 1.298722, 0.568446, -0.813396, 0.123515, +1.002737, -6.033253, -25.936216, 2.000000, 1.298722, 0.568446, -0.813396, 0.123515, +1.002737, -5.694758, -24.033106, 2.000000, 1.417808, 0.566494, -0.804616, 0.177981, +0.000000, -5.926875, -23.997019, 1.500000, 1.417808, -0.000000, -0.976472, 0.215645, +0.000000, -5.926875, -23.997019, 1.500000, 1.417808, -0.000000, -0.976472, 0.215645, +-1.002737, -5.694758, -24.033106, 1.000000, 1.417808, -0.566494, -0.804616, 0.177981, +-1.002737, -6.033253, -25.936214, 1.000000, 1.298722, -0.568446, -0.813396, 0.123515, +-1.002737, -6.033253, -25.936214, 1.000000, 1.298722, -0.568446, -0.813396, 0.123515, +-1.002737, -6.213656, -27.449341, 1.000000, 1.186658, -0.570758, -0.816393, 0.087968, +0.000000, -6.449554, -27.435261, 1.500000, 1.186658, -0.000000, -0.994229, 0.107280, +1.002737, -6.305892, -28.466030, 1.500000, 1.053028, 0.565626, -0.821288, 0.074517, +1.002737, -6.213656, -27.449341, 2.000000, 1.053028, 0.570758, -0.816393, 0.087968, +0.000000, -6.449554, -27.435261, 2.000000, 1.119843, -0.000000, -0.994229, 0.107280, +0.000000, -6.449554, -27.435261, 2.000000, 1.119843, -0.000000, -0.994229, 0.107280, +-1.002737, -6.213656, -27.449341, 2.000000, 1.186658, -0.570758, -0.816393, 0.087968, +-1.002737, -6.305892, -28.466030, 1.500000, 1.186658, -0.565626, -0.821288, 0.074517, +1.336982, -22.914524, -4.929887, 2.000000, 1.026514, 0.999805, -0.016666, 0.010584, +1.002737, -23.539934, -4.622173, 2.000000, 1.053028, 0.559738, -0.733607, 0.385376, +1.002737, -24.101816, -5.795360, 1.500000, 1.053028, 0.571338, -0.788867, 0.226409, +1.002737, -24.101816, -5.795360, 1.500000, 1.053028, 0.571338, -0.788867, 0.226409, +0.742768, -24.152987, -6.401496, 1.000000, 1.053028, 0.455754, -0.834430, -0.309862, +1.002737, -23.736286, -6.771559, 1.000000, 1.026514, 0.633041, -0.276748, -0.722959, +1.002737, -23.736286, -6.771559, 1.000000, 1.026514, 0.633041, -0.276748, -0.722959, +0.742768, -23.169422, -6.772669, 1.000000, 1.000000, 0.444774, 0.383425, -0.809421, +1.002737, -22.791559, -6.324653, 1.500000, 1.000000, 0.585182, 0.679392, -0.442706, +1.002737, -22.791559, -6.324653, 1.500000, 1.000000, 0.585182, 0.679392, -0.442706, +1.002737, -22.289114, -5.237599, 2.000000, 1.000000, 0.580101, 0.726128, -0.369081, +1.336982, -22.914524, -4.929887, 2.000000, 1.026514, 0.999805, -0.016666, 0.010584, +1.336982, -20.877926, -1.798224, 2.500000, 4.901888, 0.999242, -0.027513, 0.027552, +1.002737, -21.393009, -1.363454, 3.000000, 4.901887, 0.538985, -0.621423, 0.568620, +1.002737, -22.670450, -3.070609, 3.000000, 4.957545, 0.549531, -0.697669, 0.459646, +1.002737, -22.670450, -3.070609, 3.000000, 4.957545, 0.549531, -0.697669, 0.459646, +1.002737, -23.539934, -4.622173, 3.000000, 5.000000, 0.559738, -0.733607, 0.385376, +1.336982, -22.914524, -4.929887, 2.500000, 5.000000, 0.999805, -0.016666, 0.010584, +1.336982, -22.914524, -4.929887, 2.500000, 5.000000, 0.999805, -0.016666, 0.010584, +1.002737, -22.289114, -5.237599, 2.000000, 5.000000, 0.580101, 0.726128, -0.369081, +1.002737, -21.510138, -3.803390, 2.000000, 4.957545, 0.579339, 0.686160, -0.439944, +1.002737, -21.510138, -3.803390, 2.000000, 4.957545, 0.579339, 0.686160, -0.439944, +1.002737, -20.362839, -2.232996, 2.000000, 4.901887, 0.577401, 0.607255, -0.545756, +1.336982, -20.877926, -1.798224, 2.500000, 4.901888, 0.999242, -0.027513, 0.027552, +1.336982, -17.125900, 1.021948, 2.500000, 4.706708, 0.998755, -0.017888, 0.046575, +1.002737, -17.444981, 1.593854, 3.000000, 4.706708, 0.523473, -0.350048, 0.776815, +1.002737, -19.607264, 0.276508, 3.000000, 4.819824, 0.531663, -0.507888, 0.677779, +1.002737, -19.607264, 0.276508, 3.000000, 4.819824, 0.531663, -0.507888, 0.677779, +1.002737, -21.393009, -1.363454, 3.000000, 4.901887, 0.538985, -0.621423, 0.568620, +1.336982, -20.877926, -1.798224, 2.500000, 4.901888, 0.999242, -0.027513, 0.027552, +1.336982, -20.877926, -1.798224, 2.500000, 4.901888, 0.999242, -0.027513, 0.027552, +1.002737, -20.362839, -2.232996, 2.000000, 4.901887, 0.577401, 0.607255, -0.545756, +1.002737, -18.755436, -0.737389, 2.000000, 4.819824, 0.571841, 0.493951, -0.654989, +1.002737, -18.755436, -0.737389, 2.000000, 4.819824, 0.571841, 0.493951, -0.654989, +1.002737, -16.806824, 0.450041, 2.000000, 4.706708, 0.570721, 0.333495, -0.750372, +1.336982, -17.125900, 1.021948, 2.500000, 4.706708, 0.998755, -0.017888, 0.046575, +1.336982, -12.461710, 1.998980, 2.500000, 4.382352, 0.999581, -0.002143, 0.028884, +1.002737, -12.539209, 2.645355, 3.000000, 4.382352, 0.529316, -0.059790, 0.846315, +1.002737, -15.037928, 2.333167, 3.000000, 4.557891, 0.524224, -0.178780, 0.832603, +1.002737, -15.037928, 2.333167, 3.000000, 4.557891, 0.524224, -0.178780, 0.832603, +1.002737, -17.444981, 1.593854, 3.000000, 4.706708, 0.523473, -0.350048, 0.776815, +1.336982, -17.125900, 1.021948, 2.500000, 4.706708, 0.998755, -0.017888, 0.046575, +1.336982, -17.125900, 1.021948, 2.500000, 4.706708, 0.998755, -0.017888, 0.046575, +1.002737, -16.806824, 0.450041, 2.000000, 4.706708, 0.570721, 0.333495, -0.750372, +1.002737, -14.635897, 1.095908, 2.000000, 4.557891, 0.560822, 0.165222, -0.811283, +1.002737, -14.635897, 1.095908, 2.000000, 4.557891, 0.560822, 0.165222, -0.811283, +1.002737, -12.384212, 1.352605, 2.000000, 4.382352, 0.556840, 0.051516, -0.829021, +1.336982, -12.461710, 1.998980, 2.500000, 4.382352, 0.999581, -0.002143, 0.028884, +1.336982, -8.028582, 1.726443, 2.500000, 3.977933, 0.998903, 0.011916, 0.045285, +1.002737, -7.868385, 2.366725, 3.000000, 3.977933, 0.526810, 0.210598, 0.823480, +1.002737, -10.101929, 2.681329, 3.000000, 4.189068, 0.529646, 0.050516, 0.846713, +1.002737, -10.101929, 2.681329, 3.000000, 4.189068, 0.529646, 0.050516, 0.846713, +1.002737, -12.539209, 2.645355, 3.000000, 4.382352, 0.529316, -0.059790, 0.846315, +1.336982, -12.461710, 1.998980, 2.500000, 4.382352, 0.999581, -0.002143, 0.028884, +1.336982, -12.461710, 1.998980, 2.500000, 4.382352, 0.999581, -0.002143, 0.028884, +1.002737, -12.384212, 1.352605, 2.000000, 4.382352, 0.556840, 0.051516, -0.829021, +1.002737, -10.193325, 1.372527, 2.000000, 4.189068, 0.563923, -0.052320, -0.824168, +1.002737, -10.193325, 1.372527, 2.000000, 4.189068, 0.563923, -0.052320, -0.824168, +1.002737, -8.188779, 1.086162, 2.000000, 3.977933, 0.571796, -0.203921, -0.794648, +1.336982, -8.028582, 1.726443, 2.500000, 3.977933, 0.998903, 0.011916, 0.045285, +1.336982, -4.681401, -0.053863, 2.500000, 3.518014, 0.999076, 0.030579, 0.030219, +1.002737, -4.339529, 0.487975, 3.000000, 3.518014, 0.515414, 0.553092, 0.654552, +1.002737, -5.980879, 1.627182, 3.000000, 3.748844, 0.522693, 0.400366, 0.752661, +1.002737, -5.980879, 1.627182, 3.000000, 3.748844, 0.522693, 0.400366, 0.752661, +1.002737, -7.868385, 2.366725, 3.000000, 3.977933, 0.526810, 0.210598, 0.823480, +1.336982, -8.028582, 1.726443, 2.500000, 3.977933, 0.998903, 0.011916, 0.045285, +1.336982, -8.028582, 1.726443, 2.500000, 3.977933, 0.998903, 0.011916, 0.045285, +1.002737, -8.188779, 1.086162, 2.000000, 3.977933, 0.571796, -0.203921, -0.794648, +1.002737, -6.496116, 0.423996, 2.000000, 3.748844, 0.567467, -0.386666, -0.726960, +1.002737, -6.496116, 0.423996, 2.000000, 3.748844, 0.567467, -0.386666, -0.726960, +1.002737, -5.023273, -0.595701, 2.000000, 3.518014, 0.554291, -0.537252, -0.635706, +1.336982, -4.681401, -0.053863, 2.500000, 3.518014, 0.999076, 0.030579, 0.030219, +1.336982, -2.032627, -3.152670, 2.500000, 3.096704, 0.999446, 0.028671, 0.016899, +1.002737, -1.550435, -2.775177, 3.000000, 3.096704, 0.505988, 0.723592, 0.469458, +1.002737, -2.844458, -1.025621, 3.000000, 3.301661, 0.509526, 0.653879, 0.559309, +1.002737, -2.844458, -1.025621, 3.000000, 3.301661, 0.509526, 0.653879, 0.559309, +1.002737, -4.339529, 0.487975, 3.000000, 3.518014, 0.515414, 0.553092, 0.654552, +1.336982, -4.681401, -0.053863, 2.500000, 3.518014, 0.999076, 0.030579, 0.030219, +1.336982, -4.681401, -0.053863, 2.500000, 3.518014, 0.999076, 0.030579, 0.030219, +1.002737, -5.023273, -0.595701, 2.000000, 3.518014, 0.554291, -0.537252, -0.635706, +1.002737, -3.678185, -1.954659, 2.000000, 3.301661, 0.541785, -0.639146, -0.545858, +1.002737, -3.678185, -1.954659, 2.000000, 3.301661, 0.541785, -0.639146, -0.545858, +1.002737, -2.514818, -3.530164, 2.000000, 3.096704, 0.535283, -0.710141, -0.457354, +1.336982, -2.032627, -3.152670, 2.500000, 3.096704, 0.999446, 0.028671, 0.016899, +1.336982, -0.371475, -6.820555, 2.500000, 2.714038, 0.999079, 0.041649, 0.010372, +1.002737, 0.212362, -6.622896, 3.000000, 2.714038, 0.505651, 0.835716, 0.214230, +1.002737, -0.512230, -4.622262, 3.000000, 2.900065, 0.503207, 0.785549, 0.360132, +1.002737, -0.512230, -4.622262, 3.000000, 2.900065, 0.503207, 0.785549, 0.360132, +1.002737, -1.550435, -2.775177, 3.000000, 3.096704, 0.505988, 0.723592, 0.469458, +1.336982, -2.032627, -3.152670, 2.500000, 3.096704, 0.999446, 0.028671, 0.016899, +1.336982, -2.032627, -3.152670, 2.500000, 3.096704, 0.999446, 0.028671, 0.016899, +1.002737, -2.514818, -3.530164, 2.000000, 3.096704, 0.535283, -0.710141, -0.457354, +1.002737, -1.587135, -5.199499, 2.000000, 2.900065, 0.538039, -0.769598, -0.343850, +1.002737, -1.587135, -5.199499, 2.000000, 2.900065, 0.538039, -0.769598, -0.343850, +1.002737, -0.955311, -7.018215, 2.000000, 2.714038, 0.543591, -0.816934, -0.192683, +1.336982, -0.371475, -6.820555, 2.500000, 2.714038, 0.999079, 0.041649, 0.010372, +1.336982, -0.183937, -11.115767, 2.500000, 2.371212, 0.999002, 0.043336, -0.010816, +1.002737, 0.467394, -11.098533, 3.000000, 2.371212, 0.517497, 0.844529, -0.137721, +1.002737, 0.565540, -8.833092, 3.000000, 2.540917, 0.512670, 0.857168, 0.049331, +1.002737, 0.565540, -8.833092, 3.000000, 2.540917, 0.512670, 0.857168, 0.049331, +1.002737, 0.212362, -6.622896, 3.000000, 2.714038, 0.505651, 0.835716, 0.214230, +1.336982, -0.371475, -6.820555, 2.500000, 2.714038, 0.999079, 0.041649, 0.010372, +1.336982, -0.371475, -6.820555, 2.500000, 2.714038, 0.999079, 0.041649, 0.010372, +1.002737, -0.955311, -7.018215, 2.000000, 2.714038, 0.543591, -0.816934, -0.192683, +1.002737, -0.679521, -9.041862, 2.000000, 2.540917, 0.550509, -0.834486, -0.023924, +1.002737, -0.679521, -9.041862, 2.000000, 2.540917, 0.550509, -0.834486, -0.023924, +1.002737, -0.835270, -11.133000, 2.000000, 2.371212, 0.556778, -0.814518, 0.162970, +1.336982, -0.183937, -11.115767, 2.500000, 2.371212, 0.999002, 0.043336, -0.010816, +1.336982, -1.762512, -15.300098, 2.500000, 2.020624, 0.999977, 0.006790, -0.000522, +1.002737, -1.085560, -15.409132, 3.000000, 2.020624, 0.545979, 0.767296, -0.336399, +1.002737, -0.161999, -13.264900, 3.000000, 2.195430, 0.528455, 0.798898, -0.287224, +1.002737, -0.161999, -13.264900, 3.000000, 2.195430, 0.528455, 0.798898, -0.287224, +1.002737, 0.467394, -11.098533, 3.000000, 2.371212, 0.517497, 0.844529, -0.137721, +1.336982, -0.183937, -11.115767, 2.500000, 2.371212, 0.999002, 0.043336, -0.010816, +1.336982, -0.183937, -11.115767, 2.500000, 2.371212, 0.999002, 0.043336, -0.010816, +1.002737, -0.835270, -11.133000, 2.000000, 2.371212, 0.556778, -0.814518, 0.162970, +1.002737, -1.498060, -13.154191, 2.000000, 2.195430, 0.550846, -0.775955, 0.307348, +1.002737, -1.498060, -13.154191, 2.000000, 2.195430, 0.550846, -0.775955, 0.307348, +1.002737, -2.439466, -15.191065, 2.000000, 2.020624, 0.552162, -0.756556, 0.350343, +1.336982, -1.762512, -15.300098, 2.500000, 2.020624, 0.999977, 0.006790, -0.000522, +1.336982, -3.677238, -19.700720, 2.500000, 1.696742, 0.999943, -0.009227, 0.005371, +1.002737, -2.990782, -19.848455, 3.000000, 1.696742, 0.573541, 0.767561, -0.286181, +1.002737, -2.066217, -17.608171, 3.000000, 1.853850, 0.561407, 0.760416, -0.326481, +1.002737, -2.066217, -17.608171, 3.000000, 1.853850, 0.561407, 0.760416, -0.326481, +1.002737, -1.085560, -15.409132, 3.000000, 2.020624, 0.545979, 0.767296, -0.336399, +1.336982, -1.762512, -15.300098, 2.500000, 2.020624, 0.999977, 0.006790, -0.000522, +1.336982, -1.762512, -15.300098, 2.500000, 2.020624, 0.999977, 0.006790, -0.000522, +1.002737, -2.439466, -15.191065, 2.000000, 2.020624, 0.552162, -0.756556, 0.350343, +1.002737, -3.431055, -17.329250, 2.000000, 1.853850, 0.559291, -0.758482, 0.334513, +1.002737, -3.431055, -17.329250, 2.000000, 1.853850, 0.559291, -0.758482, 0.334513, +1.002737, -4.363696, -19.552979, 2.000000, 1.696742, 0.563275, -0.773529, 0.290474, +1.336982, -3.677238, -19.700720, 2.500000, 1.696742, 0.999943, -0.009227, 0.005371, +1.336982, -4.998410, -24.141369, 2.500000, 1.417808, 0.999879, -0.015055, 0.003873, +1.002737, -4.302059, -24.249632, 3.000000, 1.417808, 0.582444, 0.793471, -0.176531, +1.002737, -3.746061, -22.116426, 3.000000, 1.550938, 0.578794, 0.781497, -0.232937, +1.002737, -3.746061, -22.116426, 3.000000, 1.550938, 0.578794, 0.781497, -0.232937, +1.002737, -2.990782, -19.848455, 3.000000, 1.696742, 0.573541, 0.767561, -0.286181, +1.336982, -3.677238, -19.700720, 2.500000, 1.696742, 0.999943, -0.009227, 0.005371, +1.336982, -3.677238, -19.700720, 2.500000, 1.696742, 0.999943, -0.009227, 0.005371, +1.002737, -4.363696, -19.552979, 2.000000, 1.696742, 0.563275, -0.773529, 0.290474, +1.002737, -5.128252, -21.846479, 2.000000, 1.550938, 0.566340, -0.790066, 0.234638, +1.002737, -5.128252, -21.846479, 2.000000, 1.550938, 0.566340, -0.790066, 0.234638, +1.002737, -5.694758, -24.033106, 2.000000, 1.417808, 0.566494, -0.804616, 0.177981, +1.336982, -4.998410, -24.141369, 2.500000, 1.417808, 0.999879, -0.015055, 0.003873, +1.336982, -5.505962, -27.491592, 2.500000, 1.186658, 0.999932, -0.011526, 0.001722, +1.002737, -4.798269, -27.533844, 3.000000, 1.186658, 0.583019, 0.808019, -0.084825, +1.002737, -4.628780, -26.085621, 3.000000, 1.298722, 0.582983, 0.803361, -0.121414, +1.002737, -4.628780, -26.085621, 3.000000, 1.298722, 0.582983, 0.803361, -0.121414, +1.002737, -4.302059, -24.249632, 3.000000, 1.417808, 0.582444, 0.793471, -0.176531, +1.336982, -4.998410, -24.141369, 2.500000, 1.417808, 0.999879, -0.015055, 0.003873, +1.336982, -4.998410, -24.141369, 2.500000, 1.417808, 0.999879, -0.015055, 0.003873, +1.002737, -5.694758, -24.033106, 2.000000, 1.417808, 0.566494, -0.804616, 0.177981, +1.002737, -6.033253, -25.936216, 2.000000, 1.298722, 0.568446, -0.813396, 0.123515, +1.002737, -6.033253, -25.936216, 2.000000, 1.298722, 0.568446, -0.813396, 0.123515, +1.002737, -6.213656, -27.449341, 2.000000, 1.186658, 0.570758, -0.816393, 0.087968, +1.336982, -5.505962, -27.491592, 2.500000, 1.186658, 0.999932, -0.011526, 0.001722, +1.002737, -4.882575, -28.503754, 2.500000, 1.053028, 0.589040, 0.805067, -0.069986, +1.002737, -4.798269, -27.533844, 3.000000, 1.053028, 0.583019, 0.808019, -0.084825, +1.336982, -5.505962, -27.491592, 3.000000, 1.119843, 0.999932, -0.011526, 0.001722, +1.336982, -5.505962, -27.491592, 3.000000, 1.119843, 0.999932, -0.011526, 0.001722, +1.002737, -6.213656, -27.449341, 3.000000, 1.186658, 0.570758, -0.816393, 0.087968, +1.002737, -6.305892, -28.466030, 2.500000, 1.186658, 0.565626, -0.821288, 0.074517, +0.000000, -23.748404, -4.519603, 3.000000, 1.026514, -0.000000, -0.884854, 0.465869, +-1.002737, -23.539934, -4.622173, 3.000000, 1.053028, -0.559738, -0.733607, 0.385376, +-1.002737, -24.101816, -5.795360, 2.500000, 1.053028, -0.571338, -0.788867, 0.226409, +-1.002737, -24.101816, -5.795360, 2.500000, 1.053028, -0.571338, -0.788867, 0.226409, +-0.742768, -24.152987, -6.401496, 2.000000, 1.053028, -0.455754, -0.834431, -0.309862, +0.000000, -24.406044, -6.530420, 2.000000, 1.026514, 0.000000, -0.933376, -0.358900, +0.000000, -24.406044, -6.530420, 2.000000, 1.026514, 0.000000, -0.933376, -0.358900, +0.742768, -24.152987, -6.401496, 2.000000, 1.000000, 0.455754, -0.834430, -0.309862, +1.002737, -24.101816, -5.795360, 2.500000, 1.000000, 0.571338, -0.788867, 0.226409, +1.002737, -24.101816, -5.795360, 2.500000, 1.000000, 0.571338, -0.788867, 0.226409, +1.002737, -23.539934, -4.622173, 3.000000, 1.000000, 0.559738, -0.733607, 0.385376, +0.000000, -23.748404, -4.519603, 3.000000, 1.026514, -0.000000, -0.884854, 0.465869, +0.000000, -21.564705, -1.218530, 3.500000, 4.901888, 0.000000, -0.737549, 0.675293, +-1.002737, -21.393009, -1.363454, 4.000000, 4.915090, -0.538985, -0.621423, 0.568620, +-1.002737, -22.670450, -3.070609, 4.000000, 4.957545, -0.549531, -0.697669, 0.459646, +-1.002737, -22.670450, -3.070609, 4.000000, 4.957545, -0.549531, -0.697669, 0.459646, +-1.002737, -23.539934, -4.622173, 4.000000, 5.000000, -0.559738, -0.733607, 0.385376, +0.000000, -23.748404, -4.519603, 3.500000, 5.000000, -0.000000, -0.884854, 0.465869, +0.000000, -23.748404, -4.519603, 3.500000, 5.000000, -0.000000, -0.884854, 0.465869, +1.002737, -23.539934, -4.622173, 3.000000, 5.000000, 0.559738, -0.733607, 0.385376, +1.002737, -22.670450, -3.070609, 3.000000, 4.957545, 0.549531, -0.697669, 0.459646, +1.002737, -22.670450, -3.070609, 3.000000, 4.957545, 0.549531, -0.697669, 0.459646, +1.002737, -21.393009, -1.363454, 3.000000, 4.901887, 0.538985, -0.621423, 0.568620, +0.000000, -21.564705, -1.218530, 3.500000, 4.901888, 0.000000, -0.737549, 0.675293, +0.000000, -17.551340, 1.784490, 3.500000, 4.706708, -0.000000, -0.412059, 0.911157, +-1.002737, -17.444981, 1.593854, 4.000000, 4.724558, -0.523473, -0.350048, 0.776815, +-1.002737, -19.607264, 0.276508, 4.000000, 4.819824, -0.531663, -0.507888, 0.677779, +-1.002737, -19.607264, 0.276508, 4.000000, 4.819824, -0.531663, -0.507888, 0.677779, +-1.002737, -21.393009, -1.363454, 4.000000, 4.915090, -0.538985, -0.621423, 0.568620, +0.000000, -21.564705, -1.218530, 3.500000, 4.901888, 0.000000, -0.737549, 0.675293, +0.000000, -21.564705, -1.218530, 3.500000, 4.901888, 0.000000, -0.737549, 0.675293, +1.002737, -21.393009, -1.363454, 3.000000, 4.901887, 0.538985, -0.621423, 0.568620, +1.002737, -19.607264, 0.276508, 3.000000, 4.819824, 0.531663, -0.507888, 0.677779, +1.002737, -19.607264, 0.276508, 3.000000, 4.819824, 0.531663, -0.507888, 0.677779, +1.002737, -17.444981, 1.593854, 3.000000, 4.706708, 0.523473, -0.350048, 0.776815, +0.000000, -17.551340, 1.784490, 3.500000, 4.706708, -0.000000, -0.412059, 0.911157, +0.000000, -12.565042, 2.860814, 3.500000, 4.382352, -0.000000, -0.071332, 0.997453, +-1.002737, -12.539209, 2.645355, 4.000000, 4.391225, -0.529316, -0.059790, 0.846315, +-1.002737, -15.037928, 2.333167, 4.000000, 4.557892, -0.524224, -0.178780, 0.832603, +-1.002737, -15.037928, 2.333167, 4.000000, 4.557892, -0.524224, -0.178780, 0.832603, +-1.002737, -17.444981, 1.593854, 4.000000, 4.724558, -0.523473, -0.350048, 0.776815, +0.000000, -17.551340, 1.784490, 3.500000, 4.706708, -0.000000, -0.412059, 0.911157, +0.000000, -17.551340, 1.784490, 3.500000, 4.706708, -0.000000, -0.412059, 0.911157, +1.002737, -17.444981, 1.593854, 3.000000, 4.706708, 0.523473, -0.350048, 0.776815, +1.002737, -15.037928, 2.333167, 3.000000, 4.557891, 0.524224, -0.178780, 0.832603, +1.002737, -15.037928, 2.333167, 3.000000, 4.557891, 0.524224, -0.178780, 0.832603, +1.002737, -12.539209, 2.645355, 3.000000, 4.382352, 0.529316, -0.059790, 0.846315, +0.000000, -12.565042, 2.860814, 3.500000, 4.382352, -0.000000, -0.071332, 0.997453, +0.000000, -7.814985, 2.580152, 3.500000, 3.977933, -0.000000, 0.247588, 0.968866, +-1.002737, -7.868385, 2.366725, 4.000000, 3.986911, -0.526810, 0.210598, 0.823480, +-1.002737, -10.101929, 2.681329, 4.000000, 4.189068, -0.529646, 0.050516, 0.846713, +-1.002737, -10.101929, 2.681329, 4.000000, 4.189068, -0.529646, 0.050516, 0.846713, +-1.002737, -12.539209, 2.645355, 4.000000, 4.391225, -0.529316, -0.059790, 0.846315, +0.000000, -12.565042, 2.860814, 3.500000, 4.382352, -0.000000, -0.071332, 0.997453, +0.000000, -12.565042, 2.860814, 3.500000, 4.382352, -0.000000, -0.071332, 0.997453, +1.002737, -12.539209, 2.645355, 3.000000, 4.382352, 0.529316, -0.059790, 0.846315, +1.002737, -10.101929, 2.681329, 3.000000, 4.189068, 0.529646, 0.050516, 0.846713, +1.002737, -10.101929, 2.681329, 3.000000, 4.189068, 0.529646, 0.050516, 0.846713, +1.002737, -7.868385, 2.366725, 3.000000, 3.977933, 0.526810, 0.210598, 0.823480, +0.000000, -7.814985, 2.580152, 3.500000, 3.977933, -0.000000, 0.247588, 0.968866, +0.000000, -4.225573, 0.668588, 3.500000, 3.518014, -0.000000, 0.644556, 0.764557, +-1.002737, -4.339529, 0.487975, 4.000000, 3.510776, -0.515414, 0.553092, 0.654552, +-1.002737, -5.980879, 1.627182, 4.000000, 3.748844, -0.522694, 0.400366, 0.752661, +-1.002737, -5.980879, 1.627182, 4.000000, 3.748844, -0.522694, 0.400366, 0.752661, +-1.002737, -7.868385, 2.366725, 4.000000, 3.986911, -0.526810, 0.210598, 0.823480, +0.000000, -7.814985, 2.580152, 3.500000, 3.977933, -0.000000, 0.247588, 0.968866, +0.000000, -7.814985, 2.580152, 3.500000, 3.977933, -0.000000, 0.247588, 0.968866, +1.002737, -7.868385, 2.366725, 3.000000, 3.977933, 0.526810, 0.210598, 0.823480, +1.002737, -5.980879, 1.627182, 3.000000, 3.748844, 0.522693, 0.400366, 0.752661, +1.002737, -5.980879, 1.627182, 3.000000, 3.748844, 0.522693, 0.400366, 0.752661, +1.002737, -4.339529, 0.487975, 3.000000, 3.518014, 0.515414, 0.553092, 0.654552, +0.000000, -4.225573, 0.668588, 3.500000, 3.518014, -0.000000, 0.644556, 0.764557, +0.000000, -1.389704, -2.649346, 3.500000, 3.096704, 0.000000, 0.838537, 0.544844, +-1.002737, -1.550434, -2.775177, 4.000000, 3.092546, -0.505987, 0.723592, 0.469458, +-1.002737, -2.844458, -1.025621, 4.000000, 3.301661, -0.509526, 0.653879, 0.559309, +-1.002737, -2.844458, -1.025621, 4.000000, 3.301661, -0.509526, 0.653879, 0.559309, +-1.002737, -4.339529, 0.487975, 4.000000, 3.510776, -0.515414, 0.553092, 0.654552, +0.000000, -4.225573, 0.668588, 3.500000, 3.518014, -0.000000, 0.644556, 0.764557, +0.000000, -4.225573, 0.668588, 3.500000, 3.518014, -0.000000, 0.644556, 0.764557, +1.002737, -4.339529, 0.487975, 3.000000, 3.518014, 0.515414, 0.553092, 0.654552, +1.002737, -2.844458, -1.025621, 3.000000, 3.301661, 0.509526, 0.653879, 0.559309, +1.002737, -2.844458, -1.025621, 3.000000, 3.301661, 0.509526, 0.653879, 0.559309, +1.002737, -1.550435, -2.775177, 3.000000, 3.096704, 0.505988, 0.723592, 0.469458, +0.000000, -1.389704, -2.649346, 3.500000, 3.096704, 0.000000, 0.838537, 0.544844, +0.000000, 0.406973, -6.557009, 3.500000, 2.714038, -0.000000, 0.968208, 0.250145, +-1.002737, 0.212360, -6.622896, 4.000000, 2.707584, -0.505652, 0.835716, 0.214230, +-1.002737, -0.512230, -4.622262, 4.000000, 2.900065, -0.503207, 0.785550, 0.360132, +-1.002737, -0.512230, -4.622262, 4.000000, 2.900065, -0.503207, 0.785550, 0.360132, +-1.002737, -1.550434, -2.775177, 4.000000, 3.092546, -0.505987, 0.723592, 0.469458, +0.000000, -1.389704, -2.649346, 3.500000, 3.096704, 0.000000, 0.838537, 0.544844, +0.000000, -1.389704, -2.649346, 3.500000, 3.096704, 0.000000, 0.838537, 0.544844, +1.002737, -1.550435, -2.775177, 3.000000, 3.096704, 0.505988, 0.723592, 0.469458, +1.002737, -0.512230, -4.622262, 3.000000, 2.900065, 0.503207, 0.785549, 0.360132, +1.002737, -0.512230, -4.622262, 3.000000, 2.900065, 0.503207, 0.785549, 0.360132, +1.002737, 0.212362, -6.622896, 3.000000, 2.714038, 0.505651, 0.835716, 0.214230, +0.000000, 0.406973, -6.557009, 3.500000, 2.714038, -0.000000, 0.968208, 0.250145, +0.000000, 0.684505, -11.092790, 3.500000, 2.371212, 0.000000, 0.987685, -0.156457, +-1.002737, 0.467394, -11.098533, 4.000000, 2.374251, -0.517497, 0.844529, -0.137721, +-1.002737, 0.565540, -8.833092, 4.000000, 2.540917, -0.512670, 0.857167, 0.049331, +-1.002737, 0.565540, -8.833092, 4.000000, 2.540917, -0.512670, 0.857167, 0.049331, +-1.002737, 0.212360, -6.622896, 4.000000, 2.707584, -0.505652, 0.835716, 0.214230, +0.000000, 0.406973, -6.557009, 3.500000, 2.714038, -0.000000, 0.968208, 0.250145, +0.000000, 0.406973, -6.557009, 3.500000, 2.714038, -0.000000, 0.968208, 0.250145, +1.002737, 0.212362, -6.622896, 3.000000, 2.714038, 0.505651, 0.835716, 0.214230, +1.002737, 0.565540, -8.833092, 3.000000, 2.540917, 0.512670, 0.857168, 0.049331, +1.002737, 0.565540, -8.833092, 3.000000, 2.540917, 0.512670, 0.857168, 0.049331, +1.002737, 0.467394, -11.098533, 3.000000, 2.371212, 0.517497, 0.844529, -0.137721, +0.000000, 0.684505, -11.092790, 3.500000, 2.371212, 0.000000, 0.987685, -0.156457, +0.000000, -0.859908, -15.445475, 3.500000, 2.020624, 0.000000, 0.916600, -0.399806, +-1.002737, -1.085560, -15.409132, 4.000000, 2.016609, -0.545979, 0.767296, -0.336399, +-1.002737, -0.161999, -13.264900, 4.000000, 2.195430, -0.528455, 0.798898, -0.287224, +-1.002737, -0.161999, -13.264900, 4.000000, 2.195430, -0.528455, 0.798898, -0.287224, +-1.002737, 0.467394, -11.098533, 4.000000, 2.374251, -0.517497, 0.844529, -0.137721, +0.000000, 0.684505, -11.092790, 3.500000, 2.371212, 0.000000, 0.987685, -0.156457, +0.000000, 0.684505, -11.092790, 3.500000, 2.371212, 0.000000, 0.987685, -0.156457, +1.002737, 0.467394, -11.098533, 3.000000, 2.371212, 0.517497, 0.844529, -0.137721, +1.002737, -0.161999, -13.264900, 3.000000, 2.195430, 0.528455, 0.798898, -0.287224, +1.002737, -0.161999, -13.264900, 3.000000, 2.195430, 0.528455, 0.798898, -0.287224, +1.002737, -1.085560, -15.409132, 3.000000, 2.020624, 0.545979, 0.767296, -0.336399, +0.000000, -0.859908, -15.445475, 3.500000, 2.020624, 0.000000, 0.916600, -0.399806, +0.000000, -2.761963, -19.897703, 3.500000, 1.696742, 0.000000, 0.936891, -0.349623, +-1.002737, -2.990782, -19.848455, 4.000000, 1.691091, -0.573541, 0.767562, -0.286181, +-1.002737, -2.066217, -17.608171, 4.000000, 1.853850, -0.561407, 0.760416, -0.326481, +-1.002737, -2.066217, -17.608171, 4.000000, 1.853850, -0.561407, 0.760416, -0.326481, +-1.002737, -1.085560, -15.409132, 4.000000, 2.016609, -0.545979, 0.767296, -0.336399, +0.000000, -0.859908, -15.445475, 3.500000, 2.020624, 0.000000, 0.916600, -0.399806, +0.000000, -0.859908, -15.445475, 3.500000, 2.020624, 0.000000, 0.916600, -0.399806, +1.002737, -1.085560, -15.409132, 3.000000, 2.020624, 0.545979, 0.767296, -0.336399, +1.002737, -2.066217, -17.608171, 3.000000, 1.853850, 0.561407, 0.760416, -0.326481, +1.002737, -2.066217, -17.608171, 3.000000, 1.853850, 0.561407, 0.760416, -0.326481, +1.002737, -2.990782, -19.848455, 3.000000, 1.696742, 0.573541, 0.767561, -0.286181, +0.000000, -2.761963, -19.897703, 3.500000, 1.696742, 0.000000, 0.936891, -0.349623, +0.000000, -4.069942, -24.285717, 3.500000, 1.417808, 0.000000, 0.976057, -0.217516, +-1.002737, -4.302059, -24.249632, 4.000000, 1.410785, -0.582444, 0.793471, -0.176531, +-1.002737, -3.746061, -22.116426, 4.000000, 1.550938, -0.578794, 0.781497, -0.232937, +-1.002737, -3.746061, -22.116426, 4.000000, 1.550938, -0.578794, 0.781497, -0.232937, +-1.002737, -2.990782, -19.848455, 4.000000, 1.691091, -0.573541, 0.767562, -0.286181, +0.000000, -2.761963, -19.897703, 3.500000, 1.696742, 0.000000, 0.936891, -0.349623, +0.000000, -2.761963, -19.897703, 3.500000, 1.696742, 0.000000, 0.936891, -0.349623, +1.002737, -2.990782, -19.848455, 3.000000, 1.696742, 0.573541, 0.767561, -0.286181, +1.002737, -3.746061, -22.116426, 3.000000, 1.550938, 0.578794, 0.781497, -0.232937, +1.002737, -3.746061, -22.116426, 3.000000, 1.550938, 0.578794, 0.781497, -0.232937, +1.002737, -4.302059, -24.249632, 3.000000, 1.417808, 0.582444, 0.793471, -0.176531, +0.000000, -4.069942, -24.285717, 3.500000, 1.417808, 0.000000, 0.976057, -0.217516, +0.000000, -4.562372, -27.547928, 3.500000, 1.186658, 0.000000, 0.994554, -0.104226, +-1.002737, -4.798269, -27.533844, 4.000000, 1.186658, -0.583018, 0.808019, -0.084825, +-1.002737, -4.628780, -26.085621, 4.000000, 1.298722, -0.582983, 0.803361, -0.121414, +-1.002737, -4.628780, -26.085621, 4.000000, 1.298722, -0.582983, 0.803361, -0.121414, +-1.002737, -4.302059, -24.249632, 4.000000, 1.410785, -0.582444, 0.793471, -0.176531, +0.000000, -4.069942, -24.285717, 3.500000, 1.417808, 0.000000, 0.976057, -0.217516, +0.000000, -4.069942, -24.285717, 3.500000, 1.417808, 0.000000, 0.976057, -0.217516, +1.002737, -4.302059, -24.249632, 3.000000, 1.417808, 0.582444, 0.793471, -0.176531, +1.002737, -4.628780, -26.085621, 3.000000, 1.298722, 0.582983, 0.803361, -0.121414, +1.002737, -4.628780, -26.085621, 3.000000, 1.298722, 0.582983, 0.803361, -0.121414, +1.002737, -4.798269, -27.533844, 3.000000, 1.186658, 0.583019, 0.808019, -0.084825, +0.000000, -4.562372, -27.547928, 3.500000, 1.186658, 0.000000, 0.994554, -0.104226, +-1.002737, -4.882575, -28.503754, 3.500000, 1.053028, -0.589040, 0.805068, -0.069986, +-1.002737, -4.798269, -27.533844, 4.000000, 1.053028, -0.583018, 0.808019, -0.084825, +0.000000, -4.562372, -27.547928, 4.000000, 1.119843, 0.000000, 0.994554, -0.104226, +0.000000, -4.562372, -27.547928, 4.000000, 1.119843, 0.000000, 0.994554, -0.104226, +1.002737, -4.798269, -27.533844, 4.000000, 1.186658, 0.583019, 0.808019, -0.084825, +1.002737, -4.882575, -28.503754, 3.500000, 1.186658, 0.589040, 0.805067, -0.069986, +1.010821, 4.753092, -11.679992, 3.500000, 1.000000, 0.576512, -0.780907, 0.240454, +1.014864, 3.544037, -14.721523, 3.000000, 1.000000, 0.562535, -0.748836, 0.350428, +1.349109, 4.237772, -14.807808, 3.000000, 1.026514, 0.999805, 0.015731, -0.011963, +1.349109, 4.237772, -14.807808, 3.000000, 1.026514, 0.999805, 0.015731, -0.011963, +1.014864, 4.931509, -14.894089, 3.000000, 1.053028, 0.545447, 0.762198, -0.348629, +1.010821, 6.148220, -11.777804, 3.500000, 1.053028, 0.548873, 0.801150, -0.238531, +1.010821, 6.148220, -11.777804, 3.500000, 1.053028, 0.548873, 0.801150, -0.238531, +1.004758, 6.770885, -8.754030, 4.000000, 1.053028, 0.549543, 0.833398, -0.058740, +1.339004, 6.071638, -8.749280, 4.000000, 1.026514, 0.999013, 0.044275, -0.003633, +1.339004, 6.071638, -8.749280, 4.000000, 1.026514, 0.999013, 0.044275, -0.003633, +1.004758, 5.372389, -8.744530, 4.000000, 1.000000, 0.594556, -0.801738, 0.060986, +1.010821, 4.753092, -11.679992, 3.500000, 1.000000, 0.576512, -0.780907, 0.240454, +-0.994652, 4.753092, -11.679992, 2.000000, 0.093876, -0.576606, -0.781401, 0.238616, +-0.990610, 3.544037, -14.721523, 2.000000, 0.267209, -0.562098, -0.749029, 0.350717, +0.012127, 3.312792, -14.692760, 2.500000, 0.267209, 0.000169, -0.904592, 0.426279, +0.012127, 3.312792, -14.692760, 2.500000, 0.267209, 0.000169, -0.904592, 0.426279, +1.014864, 3.544037, -14.721523, 3.000000, 0.267209, 0.562535, -0.748836, 0.350428, +1.010821, 4.753092, -11.679992, 3.000000, 0.093875, 0.576512, -0.780907, 0.240454, +1.010821, 4.753092, -11.679992, 3.000000, 0.093875, 0.576512, -0.780907, 0.240454, +1.004758, 5.372389, -8.744530, 3.000000, -0.079458, 0.594556, -0.801738, 0.060986, +0.002021, 5.139305, -8.742946, 2.500000, -0.079458, -0.000101, -0.997122, 0.075814, +0.002021, 5.139305, -8.742946, 2.500000, -0.079458, -0.000101, -0.997122, 0.075814, +-1.000716, 5.372389, -8.744530, 2.000000, -0.079458, -0.594849, -0.801661, 0.059106, +-0.994652, 4.753092, -11.679992, 2.000000, 0.093876, -0.576606, -0.781401, 0.238616, +-0.994652, 6.148220, -11.777804, 1.187500, 0.109894, -0.548576, 0.800857, -0.240193, +-0.990610, 4.931509, -14.894089, 1.000000, 0.267209, -0.544986, 0.762408, -0.348891, +-1.324855, 4.237772, -14.807808, 1.500000, 0.267209, -0.999804, 0.015791, -0.011962, +-1.324855, 4.237772, -14.807808, 1.500000, 0.267209, -0.999804, 0.015791, -0.011962, +-0.990610, 3.544037, -14.721523, 2.000000, 0.267209, -0.562098, -0.749029, 0.350717, +-0.994652, 4.753092, -11.679992, 2.000000, 0.093876, -0.576606, -0.781401, 0.238616, +-0.994652, 4.753092, -11.679992, 2.000000, 0.093876, -0.576606, -0.781401, 0.238616, +-1.000716, 5.372389, -8.744530, 2.000000, -0.079458, -0.594849, -0.801661, 0.059106, +-1.334961, 6.071638, -8.749280, 1.500000, -0.079458, -0.999000, 0.044233, -0.006500, +-1.334961, 6.071638, -8.749280, 1.500000, -0.079458, -0.999000, 0.044233, -0.006500, +-1.000716, 6.770885, -8.754030, 1.000000, -0.079458, -0.549751, 0.833161, -0.060139, +-0.994652, 6.148220, -11.777804, 1.187500, 0.109894, -0.548576, 0.800857, -0.240193, +1.010821, 6.148220, -11.777804, 1.500000, 0.222021, 0.548873, 0.801150, -0.238531, +1.014864, 4.931509, -14.894089, 3.000000, 0.523501, 0.545447, 0.762198, -0.348629, +0.012127, 5.162754, -14.922852, 2.000000, 0.395355, 0.000167, 0.910359, -0.413819, +0.012127, 5.162754, -14.922852, 2.000000, 0.395355, 0.000167, 0.910359, -0.413819, +-0.990610, 4.931509, -14.894089, 1.000000, 0.267209, -0.544986, 0.762408, -0.348891, +-0.994652, 6.148220, -11.777804, 1.187500, 0.109894, -0.548576, 0.800857, -0.240193, +-0.994652, 6.148220, -11.777804, 1.187500, 0.109894, -0.548576, 0.800857, -0.240193, +-1.000716, 6.770885, -8.754030, 1.000000, -0.079458, -0.549751, 0.833161, -0.060139, +0.002021, 7.003967, -8.755614, 0.500000, -0.079458, -0.000102, 0.997541, -0.070087, +0.002021, 7.003967, -8.755614, 0.500000, -0.079458, -0.000102, 0.997541, -0.070087, +1.004758, 6.770885, -8.754030, 0.000000, -0.079458, 0.549543, 0.833398, -0.058740, +1.010821, 6.148220, -11.777804, 1.500000, 0.222021, 0.548873, 0.801150, -0.238531, +-1.002737, 1.949966, 10.301342, 3.000000, 0.093875, -0.548106, -0.827983, 0.118418, +-1.002737, 1.707661, 7.456823, 3.000000, 0.267209, -0.546192, -0.837529, 0.014826, +0.000000, 1.483450, 7.466458, 3.000000, 0.395355, 0.000000, -0.999837, 0.018050, +0.000000, 1.483450, 7.466458, 3.000000, 0.395355, 0.000000, -0.999837, 0.018050, +1.002737, 1.707661, 7.456823, 3.000000, 0.523501, 0.546192, -0.837529, 0.014826, +1.002737, 1.949966, 10.301342, 3.000000, -0.199582, 0.548430, -0.827643, 0.119301, +1.002737, 1.949966, 10.301342, 3.000000, -0.199582, 0.548430, -0.827643, 0.119301, +0.997835, 2.515034, 13.079953, 3.000000, -0.922665, 0.552074, -0.807195, 0.208929, +-0.004902, 2.294706, 13.134627, 3.000000, -0.501061, 0.000247, -0.968748, 0.248048, +-0.004902, 2.294706, 13.134627, 3.000000, -0.501061, 0.000247, -0.968748, 0.248048, +-1.007639, 2.515034, 13.079953, 3.000000, -0.079458, -0.551445, -0.808533, 0.205386, +-1.002737, 1.949966, 10.301342, 3.000000, 0.093875, -0.548106, -0.827983, 0.118418, +-1.002737, 3.286348, 10.103830, 1.187500, -1.435965, -0.570397, 0.812622, -0.119555, +-1.002737, 3.052929, 7.399012, 1.000000, -1.306215, -0.571504, 0.820505, -0.012461, +-1.336982, 2.380295, 7.427917, 1.500000, -1.306215, -0.999670, -0.025705, 0.000199, +-1.336982, 2.380295, 7.427917, 1.500000, -1.306215, -0.999670, -0.025705, 0.000199, +-1.002737, 1.707661, 7.456823, 2.000000, -1.306215, -0.546192, -0.837529, 0.014826, +-1.002737, 1.949966, 10.301342, 2.000000, -1.459937, -0.548106, -0.827983, 0.118418, +-1.002737, 1.949966, 10.301342, 2.000000, -1.459937, -0.548106, -0.827983, 0.118418, +-1.007639, 2.515034, 13.079953, 2.000000, -1.613659, -0.551445, -0.808533, 0.205386, +-1.341885, 3.176014, 12.915927, 1.500000, -1.613659, -0.999798, -0.020077, 0.001135, +-1.341885, 3.176014, 12.915927, 1.500000, -1.613659, -0.999798, -0.020077, 0.001135, +-1.007639, 3.836994, 12.751901, 1.000000, -1.613659, -0.571038, 0.793815, -0.209219, +-1.002737, 3.286348, 10.103830, 1.187500, -1.435965, -0.570397, 0.812622, -0.119555, +1.002737, 3.286348, 10.103830, 1.500000, -1.268162, 0.570686, 0.812576, -0.118478, +1.002737, 3.052929, 7.399012, 3.000000, -0.922665, 0.571504, 0.820504, -0.012461, +0.000000, 3.277142, 7.389376, 2.000000, -1.114440, 0.000000, 0.999891, -0.014768, +0.000000, 3.277142, 7.389376, 2.000000, -1.114440, 0.000000, 0.999891, -0.014768, +-1.002737, 3.052929, 7.399012, 1.000000, -1.306215, -0.571504, 0.820505, -0.012461, +-1.002737, 3.286348, 10.103830, 1.187500, -1.435965, -0.570397, 0.812622, -0.119555, +-1.002737, 3.286348, 10.103830, 1.187500, -1.435965, -0.570397, 0.812622, -0.119555, +-1.007639, 3.836994, 12.751901, 1.000000, -1.613659, -0.571038, 0.793815, -0.209219, +-0.004902, 4.057320, 12.697225, 0.500000, -1.613659, 0.000259, 0.967531, -0.252752, +-0.004902, 4.057320, 12.697225, 0.500000, -1.613659, 0.000259, 0.967531, -0.252752, +0.997834, 3.836994, 12.751901, 0.000000, -1.613659, 0.571655, 0.794480, -0.204969, +1.002737, 3.286348, 10.103830, 1.500000, -1.268162, 0.570686, 0.812576, -0.118478, +1.002737, 1.949966, 10.301342, 3.000000, -1.459937, 0.548430, -0.827643, 0.119301, +1.002737, 1.707661, 7.456823, 3.000000, -1.306215, 0.546192, -0.837529, 0.014826, +1.336982, 2.380295, 7.427917, 3.000000, -1.114440, 0.999670, -0.025705, 0.000199, +1.336982, 2.380295, 7.427917, 3.000000, -1.114440, 0.999670, -0.025705, 0.000199, +1.002737, 3.052929, 7.399012, 3.000000, -0.922665, 0.571504, 0.820504, -0.012461, +1.002737, 3.286348, 10.103830, 2.833333, -1.322391, 0.570686, 0.812576, -0.118478, +1.002737, 3.286348, 10.103830, 2.833333, -1.322391, 0.570686, 0.812576, -0.118478, +0.997834, 3.836994, 12.751901, 2.666667, -1.722117, 0.571655, 0.794480, -0.204969, +1.332080, 3.176014, 12.915927, 2.833333, -1.667888, 0.999801, -0.018232, 0.008046, +1.332080, 3.176014, 12.915927, 2.833333, -1.667888, 0.999801, -0.018232, 0.008046, +0.997835, 2.515034, 13.079953, 3.000000, -1.613659, 0.552074, -0.807195, 0.208929, +1.002737, 1.949966, 10.301342, 3.000000, -1.459937, 0.548430, -0.827643, 0.119301, +0.983128, 5.711351, 20.357510, 2.000000, -1.459937, 0.562328, -0.698593, 0.442442, +0.973323, 4.412262, 18.174875, 2.000000, -1.306215, 0.554281, -0.740975, 0.379115, +1.307569, 5.044981, 17.903212, 2.500000, -1.306215, 0.999751, -0.019683, 0.010530, +1.307569, 5.044981, 17.903212, 2.500000, -1.306215, 0.999751, -0.019683, 0.010530, +0.973323, 5.677700, 17.631544, 3.000000, -1.306215, 0.576561, 0.724323, -0.378066, +0.983128, 6.945759, 19.711123, 3.000000, -1.459937, 0.574803, 0.682785, -0.451006, +0.983128, 6.945759, 19.711123, 3.000000, -1.459937, 0.574803, 0.682785, -0.451006, +0.997834, 8.160118, 21.422651, 3.000000, -1.613659, 0.574744, 0.665807, -0.475784, +1.332080, 7.556932, 21.789433, 2.500000, -1.613659, 0.999977, -0.005048, -0.004524, +1.332080, 7.556932, 21.789433, 2.500000, -1.613659, 0.999977, -0.005048, -0.004524, +0.997835, 6.953747, 22.156214, 2.000000, -1.613659, 0.572743, -0.675634, 0.464203, +0.983128, 5.711351, 20.357510, 2.000000, -1.459937, 0.562328, -0.698593, 0.442442, +-1.022346, 5.711351, 20.357510, 2.000000, -1.857690, -0.562464, -0.695442, 0.447208, +-1.032151, 4.412262, 18.174877, 2.000000, -1.776346, -0.555665, -0.740194, 0.378615, +-0.029414, 4.201355, 18.265430, 2.500000, -1.776346, -0.000535, -0.890739, 0.454514, +-0.029414, 4.201355, 18.265430, 2.500000, -1.776346, -0.000535, -0.890739, 0.454514, +0.973323, 4.412262, 18.174875, 3.000000, -1.776346, 0.554281, -0.740975, 0.379115, +0.983128, 5.711351, 20.357510, 3.000000, -1.857690, 0.562328, -0.698593, 0.442442, +0.983128, 5.711351, 20.357510, 3.000000, -1.857690, 0.562328, -0.698593, 0.442442, +0.997835, 6.953747, 22.156214, 3.000000, -1.939034, 0.572743, -0.675634, 0.464203, +-0.004902, 6.752687, 22.278475, 2.500000, -1.939034, 0.000369, -0.822635, 0.568570, +-0.004902, 6.752687, 22.278475, 2.500000, -1.939034, 0.000369, -0.822635, 0.568570, +-1.007639, 6.953747, 22.156216, 2.000000, -1.939034, -0.571627, -0.672843, 0.469600, +-1.022346, 5.711351, 20.357510, 2.000000, -1.857690, -0.562464, -0.695442, 0.447208, +-1.022346, 6.945759, 19.711123, 1.000000, -1.857690, -0.575450, 0.685898, -0.445422, +-1.032151, 5.677700, 17.631544, 1.000000, -1.776346, -0.577835, 0.723604, -0.377496, +-1.366396, 5.044981, 17.903212, 1.500000, -1.776346, -0.999757, -0.019426, 0.010462, +-1.366396, 5.044981, 17.903212, 1.500000, -1.776346, -0.999757, -0.019426, 0.010462, +-1.032151, 4.412262, 18.174877, 2.000000, -1.776346, -0.555665, -0.740194, 0.378615, +-1.022346, 5.711351, 20.357510, 2.000000, -1.857690, -0.562464, -0.695442, 0.447208, +-1.022346, 5.711351, 20.357510, 2.000000, -1.857690, -0.562464, -0.695442, 0.447208, +-1.007639, 6.953747, 22.156216, 2.000000, -1.939034, -0.571627, -0.672843, 0.469600, +-1.341885, 7.556932, 21.789433, 1.500000, -1.939034, -0.999989, 0.000304, 0.004665, +-1.341885, 7.556932, 21.789433, 1.500000, -1.939034, -0.999989, 0.000304, 0.004665, +-1.007639, 8.160118, 21.422651, 1.000000, -1.939034, -0.574068, 0.669723, -0.471080, +-1.022346, 6.945759, 19.711123, 1.000000, -1.857690, -0.575450, 0.685898, -0.445422, +-1.002737, 8.987209, 23.827108, 1.833333, -1.749232, -0.690086, 0.408969, 0.597098, +-0.742768, 8.411285, 23.925793, 1.000000, -1.776346, -0.485429, -0.281111, 0.827850, +0.000000, 8.401409, 24.234768, 1.000000, -1.857690, -0.000001, -0.291501, 0.956571, +0.000000, 8.401409, 24.234768, 1.000000, -1.857690, -0.000001, -0.291501, 0.956571, +0.742768, 8.411285, 23.925795, 1.000000, -1.939034, 0.485428, -0.281111, 0.827851, +1.002737, 8.987209, 23.827108, 0.500000, -1.939034, 0.690085, 0.408969, 0.597099, +1.002737, 8.987209, 23.827108, 0.500000, -1.939034, 0.690085, 0.408969, 0.597099, +0.742768, 9.282909, 23.329664, 0.000000, -1.939034, 0.487250, 0.872639, 0.032983, +0.000000, 9.573013, 23.419453, 1.333333, -1.830575, -0.000000, 0.997856, 0.065453, +0.000000, 9.573013, 23.419453, 1.333333, -1.830575, -0.000000, 0.997856, 0.065453, +-0.742768, 9.282909, 23.329664, 2.666667, -1.722117, -0.487251, 0.872639, 0.032983, +-1.002737, 8.987209, 23.827108, 1.833333, -1.749232, -0.690086, 0.408969, 0.597098, +0.983128, 6.945759, 19.711123, 1.500000, -2.000000, 0.574803, 0.682785, -0.451006, +0.973323, 5.677700, 17.631544, 2.000000, -2.000000, 0.576561, 0.724323, -0.378066, +-0.029414, 5.888605, 17.540989, 2.500000, -2.000000, -0.000556, 0.885983, -0.463718, +-0.029414, 5.888605, 17.540989, 2.500000, -2.000000, -0.000556, 0.885983, -0.463718, +-1.032151, 5.677700, 17.631544, 3.000000, -2.000000, -0.577835, 0.723604, -0.377496, +-1.022346, 6.945759, 19.711123, 3.500000, -2.000000, -0.575450, 0.685898, -0.445422, +-1.022346, 6.945759, 19.711123, 3.500000, -2.000000, -0.575450, 0.685898, -0.445422, +-1.007639, 8.160118, 21.422651, 4.000000, -2.000000, -0.574068, 0.669723, -0.471080, +-0.004902, 8.361179, 21.300390, 2.500000, -2.000000, 0.000389, 0.815229, -0.579139, +-0.004902, 8.361179, 21.300390, 2.500000, -2.000000, 0.000389, 0.815229, -0.579139, +0.997834, 8.160118, 21.422651, 1.000000, -2.000000, 0.574744, 0.665807, -0.475784, +0.983128, 6.945759, 19.711123, 1.500000, -2.000000, 0.574803, 0.682785, -0.451006, +-1.005175, 11.029587, -4.132468, 3.000000, -1.857690, -0.578521, -0.809497, -0.100142, +-1.006394, 11.114811, -5.517140, 3.000000, -1.776346, -0.583093, -0.812392, -0.004755, +-0.003657, 10.880220, -5.483850, 2.833333, -1.749232, -0.000127, -0.999975, -0.007088, +-0.003657, 10.880220, -5.483850, 2.833333, -1.749232, -0.000127, -0.999975, -0.007088, +0.999079, 11.114811, -5.517140, 2.666667, -1.722117, 0.582792, -0.812607, -0.004817, +1.000299, 11.029585, -4.132468, 3.333333, -1.830575, 0.578319, -0.809495, -0.101318, +1.000299, 11.029585, -4.132468, 3.333333, -1.830575, 0.578319, -0.809495, -0.101318, +1.002127, 10.729588, -2.409474, 4.000000, -1.939034, 0.568931, -0.804350, -0.171283, +-0.000610, 10.494156, -2.383091, 3.500000, -1.939034, 0.000040, -0.977947, -0.208854, +-0.000610, 10.494156, -2.383091, 3.500000, -1.939034, 0.000040, -0.977947, -0.208854, +-1.003346, 10.729588, -2.409474, 3.000000, -1.939034, -0.568927, -0.804482, -0.170679, +-1.005175, 11.029587, -4.132468, 3.000000, -1.857690, -0.578521, -0.809497, -0.100142, +-1.005175, 12.441681, -4.309345, 1.000000, -0.253818, -0.554831, 0.825951, 0.099839, +-1.006394, 12.522362, -5.716876, 1.000000, -0.170915, -0.566040, 0.824377, 0.001632, +-1.340640, 11.818584, -5.617008, 1.500000, -0.170915, -0.999853, 0.017074, 0.001872, +-1.340640, 11.818584, -5.617008, 1.500000, -0.170915, -0.999853, 0.017074, 0.001872, +-1.006394, 11.114811, -5.517140, 2.000000, -0.170915, -0.583093, -0.812392, -0.004755, +-1.005175, 11.029587, -4.132468, 2.000000, -0.253818, -0.578521, -0.809497, -0.100142, +-1.005175, 11.029587, -4.132468, 2.000000, -0.253818, -0.578521, -0.809497, -0.100142, +-1.003346, 10.729588, -2.409474, 2.000000, -0.336720, -0.568927, -0.804482, -0.170679, +-1.337592, 11.435898, -2.488622, 1.500000, -0.336720, -0.999671, 0.024155, 0.008634, +-1.337592, 11.435898, -2.488622, 1.500000, -0.336720, -0.999671, 0.024155, 0.008634, +-1.003346, 12.142200, -2.567771, 1.000000, -0.336720, -0.545383, 0.819886, 0.174196, +-1.005175, 12.441681, -4.309345, 1.000000, -0.253818, -0.554831, 0.825951, 0.099839, +0.000000, 25.158775, 0.885566, 0.666667, -0.891999, 0.000000, 0.098978, -0.995090, +0.742768, 25.130249, 1.141007, 1.333333, -1.447277, 0.424007, 0.088516, -0.901323, +1.002737, 24.600067, 1.327282, 1.166667, -0.809096, 0.595697, -0.491752, -0.635079, +1.002737, 24.600067, 1.327282, 1.166667, -0.809096, 0.595697, -0.491752, -0.635079, +0.742768, 24.296909, 1.783397, 1.000000, -0.170915, 0.428917, -0.894621, -0.125234, +0.000000, 24.041351, 1.768998, 1.000000, -0.253818, 0.000000, -0.991299, -0.131630, +0.000000, 24.041351, 1.768998, 1.000000, -0.253818, 0.000000, -0.991299, -0.131630, +-0.742768, 24.296909, 1.783397, 1.000000, -0.336720, -0.428917, -0.894621, -0.125234, +-1.002737, 24.600067, 1.327282, 0.500000, -0.336720, -0.595697, -0.491752, -0.635079, +-1.002737, 24.600067, 1.327282, 0.500000, -0.336720, -0.595697, -0.491752, -0.635079, +-0.742768, 25.130249, 1.141007, 0.000000, -0.336720, -0.424007, 0.088516, -0.901323, +0.000000, 25.158775, 0.885566, 0.666667, -0.891999, 0.000000, 0.098978, -0.995090, +1.000299, 12.441681, -4.309345, 1.500000, -4.000000, 0.554885, 0.826037, 0.098819, +0.999079, 12.522362, -5.716876, 2.000000, -4.000000, 0.565733, 0.824587, 0.001687, +-0.003657, 12.756954, -5.750165, 2.500000, -4.000000, -0.000126, 1.000000, 0.000870, +-0.003657, 12.756954, -5.750165, 2.500000, -4.000000, -0.000126, 1.000000, 0.000870, +-1.006394, 12.522362, -5.716876, 3.000000, -4.000000, -0.566040, 0.824377, 0.001632, +-1.005175, 12.441681, -4.309345, 3.500000, -4.000000, -0.554831, 0.825951, 0.099839, +-1.005175, 12.441681, -4.309345, 3.500000, -4.000000, -0.554831, 0.825951, 0.099839, +-1.003346, 12.142200, -2.567771, 4.000000, -4.000000, -0.545383, 0.819886, 0.174196, +-0.000610, 12.377636, -2.594154, 2.500000, -4.000000, 0.000041, 0.978486, 0.206311, +-0.000610, 12.377636, -2.594154, 2.500000, -4.000000, 0.000041, 0.978486, 0.206311, +1.002127, 12.142200, -2.567771, 1.000000, -4.000000, 0.545588, 0.819894, 0.173516, +1.000299, 12.441681, -4.309345, 1.500000, -4.000000, 0.554885, 0.826037, 0.098819, +1.000299, 11.029585, -4.132468, 4.000000, -3.848496, 0.578319, -0.809495, -0.101318, +0.999079, 11.114811, -5.517140, 4.000000, -3.761107, 0.582792, -0.812607, -0.004817, +1.333325, 11.818588, -5.617008, 4.000000, -3.594440, 0.999852, 0.017082, 0.001868, +1.333325, 11.818588, -5.617008, 4.000000, -3.594440, 0.999852, 0.017082, 0.001868, +0.999079, 12.522362, -5.716876, 4.000000, -3.427773, 0.565733, 0.824587, 0.001687, +1.000299, 12.441681, -4.309345, 4.000000, -3.234054, 0.554885, 0.826037, 0.098819, +1.000299, 12.441681, -4.309345, 4.000000, -3.234054, 0.554885, 0.826037, 0.098819, +1.002127, 12.142200, -2.567771, 4.000000, -3.040334, 0.545588, 0.819894, 0.173516, +1.336373, 11.435898, -2.488622, 4.000000, -3.488110, 0.999684, 0.024018, 0.007427, +1.336373, 11.435898, -2.488622, 4.000000, -3.488110, 0.999684, 0.024018, 0.007427, +1.002127, 10.729588, -2.409474, 4.000000, -3.935886, 0.568931, -0.804350, -0.171283, +1.000299, 11.029585, -4.132468, 4.000000, -3.848496, 0.578319, -0.809495, -0.101318, +1.002737, -23.736286, -6.771559, 0.500000, 1.053028, 0.633041, -0.276748, -0.722959, +0.742768, -24.152987, -6.401496, 1.000000, 1.053028, 0.455754, -0.834430, -0.309862, +0.000000, -24.406044, -6.530420, 1.500000, 1.053028, 0.000000, -0.933376, -0.358900, +0.000000, -24.406044, -6.530420, 1.500000, 1.053028, 0.000000, -0.933376, -0.358900, +-0.742768, -24.152987, -6.401496, 2.000000, 1.053028, -0.455754, -0.834431, -0.309862, +-1.002737, -23.736286, -6.771559, 4.000000, -0.306819, -0.633041, -0.276747, -0.722959, +-1.002737, -23.736286, -6.771559, 4.000000, -0.306819, -0.633041, -0.276747, -0.722959, +-0.742768, -23.169422, -6.772669, 6.000000, -1.666667, -0.444774, 0.383424, -0.809421, +0.000000, -23.066525, -7.012697, 3.000000, -0.306819, -0.000000, 0.424976, -0.905205, +0.000000, -23.066525, -7.012697, 3.000000, -0.306819, -0.000000, 0.424976, -0.905205, +0.742768, -23.169422, -6.772669, 0.000000, 1.053028, 0.444774, 0.383425, -0.809421, +1.002737, -23.736286, -6.771559, 0.500000, 1.053028, 0.633041, -0.276748, -0.722959, +1.336982, -2.618040, 4.463405, 4.000000, -0.333333, 0.999977, -0.006223, -0.002555, +1.002737, -3.239137, 4.110385, 5.000000, -1.666667, 0.573276, -0.760494, -0.304965, +1.002737, -2.684134, 2.725971, 2.500000, -0.689796, 0.555812, -0.771611, -0.309336, +1.002737, -1.445931, 3.440848, 2.500000, -0.500000, 0.596303, 0.745197, 0.298504, +1.002737, -1.996943, 4.816424, 3.000000, 1.000000, 0.580237, 0.756078, 0.302774, +1.336982, -2.618040, 4.463405, 4.000000, -0.333333, 0.999977, -0.006223, -0.002555, +-1.336982, -0.581338, -32.314465, 0.500000, 0.972854, 0.000000, -0.028514, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +-1.002737, -1.292564, -32.294178, 1.000000, 0.972854, 0.000000, -0.028512, -0.999593, +-1.336982, 4.212124, -29.503693, 0.500000, 0.966243, 0.000000, -0.038077, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +-1.002737, 3.502487, -29.476650, 1.000000, 0.966243, 0.000000, -0.038077, -0.999275, +-1.336982, -5.594234, -28.484890, 0.500000, 1.119843, -0.000004, -0.026495, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +-1.002737, -6.305892, -28.466030, 0.500000, 1.053028, -0.000002, -0.026494, -0.999649, +-1.336982, -2.065033, 3.083410, 3.500000, -1.833333, 0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +-1.002737, -2.684134, 2.725971, 3.500000, -1.666667, 0.000000, 0.500000, -0.866025, +1.002737, 0.129889, -32.334755, 2.937500, 0.946466, 0.000002, -0.028517, -0.999593, +1.336982, -0.581338, -32.314465, 2.500000, 0.972854, 0.000000, -0.028517, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +1.336982, -0.581338, -32.314465, 2.500000, 0.972854, 0.000000, -0.028517, -0.999593, +1.002737, -1.292564, -32.294174, 2.000000, 0.972854, 0.000002, -0.028516, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +1.002737, -1.292564, -32.294174, 2.000000, 0.972854, 0.000002, -0.028516, -0.999593, +0.000000, -1.529640, -32.287415, 1.500000, 0.972854, 0.000002, -0.028513, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +0.000000, -1.529640, -32.287415, 1.500000, 0.972854, 0.000002, -0.028513, -0.999593, +-1.002737, -1.292564, -32.294178, 1.000000, 0.972854, 0.000000, -0.028512, -0.999593, +-1.002737, 0.129889, -32.334755, 3.500000, 0.761751, -0.000002, -0.028517, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +-1.336982, -0.581338, -32.314465, 0.500000, 0.972854, 0.000000, -0.028514, -0.999593, +0.000000, 0.366964, -32.341518, 3.250000, 0.867302, 0.000000, -0.028517, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +-1.002737, 0.129889, -32.334755, 3.500000, 0.761751, -0.000002, -0.028517, -0.999593, +1.002737, 0.129889, -32.334755, 2.937500, 0.946466, 0.000002, -0.028517, -0.999593, +-0.000000, -0.581338, -32.314465, 1.968750, 0.959660, 0.000001, -0.028515, -0.999593, +0.000000, 0.366964, -32.341518, 3.250000, 0.867302, 0.000000, -0.028517, -0.999593, +1.002737, 4.921762, -29.530731, 3.000000, 0.966243, -0.000000, -0.038080, -0.999275, +1.336982, 4.212124, -29.503689, 2.500000, 0.966243, 0.000000, -0.038077, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +1.336982, 4.212124, -29.503689, 2.500000, 0.966243, 0.000000, -0.038077, -0.999275, +1.002737, 3.502487, -29.476650, 2.000000, 0.966243, 0.000000, -0.038075, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +1.002737, 3.502487, -29.476650, 2.000000, 0.966243, 0.000000, -0.038075, -0.999275, +0.000000, 3.265942, -29.467636, 1.500000, 0.966243, 0.000000, -0.038076, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +0.000000, 3.265942, -29.467636, 1.500000, 0.966243, 0.000000, -0.038076, -0.999275, +-1.002737, 3.502487, -29.476650, 1.000000, 0.966243, 0.000000, -0.038077, -0.999275, +-1.002737, 4.921762, -29.530731, 4.000000, 0.966243, 0.000000, -0.038077, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +-1.336982, 4.212124, -29.503693, 0.500000, 0.966243, 0.000000, -0.038077, -0.999275, +0.000000, 5.158308, -29.539745, 3.500000, 0.966243, -0.000000, -0.038080, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +-1.002737, 4.921762, -29.530731, 4.000000, 0.966243, 0.000000, -0.038077, -0.999275, +1.002737, 4.921762, -29.530731, 3.000000, 0.966243, -0.000000, -0.038080, -0.999275, +-0.000000, 4.212124, -29.503689, 2.000000, 0.966243, -0.000000, -0.038077, -0.999275, +0.000000, 5.158308, -29.539745, 3.500000, 0.966243, -0.000000, -0.038080, -0.999275, +1.002737, -4.882575, -28.503754, 2.500000, 1.053028, -0.000002, -0.026493, -0.999649, +1.336982, -5.594234, -28.484890, 2.500000, 1.119843, 0.000002, -0.026495, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +1.336982, -5.594234, -28.484890, 2.500000, 1.119843, 0.000002, -0.026495, -0.999649, +1.002737, -6.305892, -28.466030, 1.500000, 1.053028, 0.000002, -0.026494, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +1.002737, -6.305892, -28.466030, 1.500000, 1.053028, 0.000002, -0.026494, -0.999649, +0.000000, -6.543112, -28.459743, 1.500000, 1.119843, 0.000000, -0.026496, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +0.000000, -6.543112, -28.459743, 1.500000, 1.119843, 0.000000, -0.026496, -0.999649, +-1.002737, -6.305892, -28.466030, 0.500000, 1.053028, -0.000002, -0.026494, -0.999649, +-1.002737, -4.882575, -28.503754, 3.500000, 1.053028, -0.000001, -0.026493, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +-1.336982, -5.594234, -28.484890, 0.500000, 1.119843, -0.000004, -0.026495, -0.999649, +0.000000, -4.645356, -28.510036, 3.500000, 1.119843, 0.000000, -0.026488, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +-1.002737, -4.882575, -28.503754, 3.500000, 1.053028, -0.000001, -0.026493, -0.999649, +1.002737, -4.882575, -28.503754, 2.500000, 1.053028, -0.000002, -0.026493, -0.999649, +0.000000, -5.594234, -28.484894, 1.500000, 1.053028, -0.000000, -0.026493, -0.999649, +0.000000, -4.645356, -28.510036, 3.500000, 1.119843, 0.000000, -0.026488, -0.999649, +1.002737, -1.445931, 3.440848, 2.500000, -0.500000, -0.000000, 0.500000, -0.866025, +1.336982, -2.065033, 3.083410, 2.500000, -0.594898, 0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +1.336982, -2.065033, 3.083410, 2.500000, -0.594898, 0.000000, 0.500000, -0.866025, +1.002737, -2.684134, 2.725971, 4.500000, -1.666667, -0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +1.002737, -2.684134, 2.725971, 4.500000, -1.666667, -0.000000, 0.500000, -0.866025, +0.000000, -2.890502, 2.606825, 4.500000, -1.833333, 0.000000, 0.500000, -0.866026, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +0.000000, -2.890502, 2.606825, 4.500000, -1.833333, 0.000000, 0.500000, -0.866026, +-1.002737, -2.684134, 2.725971, 3.500000, -1.666667, 0.000000, 0.500000, -0.866025, +-1.002737, -1.445931, 3.440848, 2.500000, -1.666667, 0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +-1.336982, -2.065033, 3.083410, 3.500000, -1.833333, 0.000000, 0.500000, -0.866025, +0.000000, -1.239565, 3.559994, 2.500000, -1.833333, 0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +-1.002737, -1.445931, 3.440848, 2.500000, -1.666667, 0.000000, 0.500000, -0.866025, +1.002737, -1.445931, 3.440848, 2.500000, -0.500000, -0.000000, 0.500000, -0.866025, +0.000000, -2.065034, 3.083410, 3.000000, -1.083333, 0.000000, 0.500000, -0.866025, +0.000000, -1.239565, 3.559994, 2.500000, -1.833333, 0.000000, 0.500000, -0.866025, +4.193409, -2.445326, 32.893612, 3.000000, -0.594415, 0.682263, 0.725032, 0.094055, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +5.620958, -6.307936, 32.893612, 2.375000, -0.573582, 0.996241, -0.000983, 0.086619, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +4.193409, -10.256766, 32.893612, 1.972222, -0.557378, 0.680284, -0.725440, 0.104643, +5.620958, -6.307936, 32.893612, 2.375000, -0.573582, 0.996241, -0.000983, 0.086619, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +0.000000, -11.548096, 32.893612, 1.500000, -0.573582, -0.004203, -0.998166, 0.060395, +4.193409, -10.256766, 32.893612, 1.972222, -0.557378, 0.680284, -0.725440, 0.104643, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +-4.193409, -10.256766, 32.893612, 1.027778, -0.557378, -0.685012, -0.716396, 0.132421, +0.000000, -11.548096, 32.893612, 1.500000, -0.573582, -0.004203, -0.998166, 0.060395, +-5.620958, -6.307936, 32.893612, 0.625000, -0.573582, -0.991757, -0.001005, 0.128133, +-4.193409, -10.256766, 32.893612, 1.027778, -0.557378, -0.685012, -0.716396, 0.132421, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +-4.193409, -2.445326, 32.893612, 0.000000, -0.594415, -0.686924, 0.716419, 0.121978, +-5.620958, -6.307936, 32.893612, 0.625000, -0.573582, -0.991757, -0.001005, 0.128133, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +0.000000, -1.067776, 32.893612, 3.500000, -0.594415, -0.004492, 0.998437, 0.055707, +-4.193409, -2.445326, 32.893612, 4.000000, -0.594415, -0.686924, 0.716419, 0.121978, +0.250684, -6.277495, 43.932335, 1.687500, -0.646499, 0.009105, 0.001936, 0.999957, +4.193409, -2.445326, 32.893612, 3.000000, -0.594415, 0.682263, 0.725032, 0.094055, +0.000000, -1.067776, 32.893612, 3.500000, -0.594415, -0.004492, 0.998437, 0.055707, +}; diff --git a/tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.cpp b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.cpp new file mode 100644 index 0000000..61586d8 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.cpp @@ -0,0 +1,351 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "RenderInterface.h" +#include "MeshShaderParam.h" +#include "RenderPlugin.h" + +namespace RenderInterface +{ + +//////////////////////////////////////////////////////////////////////////////////////////// +bool InitDevice(int deviceID) +{ + if (!RenderPlugin::Instance()->InitDevice(deviceID)) + { + MessageBox( 0, L"Could not create device.", L"Error", MB_ICONEXCLAMATION ); + return false; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////// +bool GetDeviceInfoString(wchar_t *str) +{ + return RenderPlugin::Instance()->GetDeviceInfoString(str); +} + +////////////////////////////////////////////////////////////////////////// +bool Initialize() +{ + return RenderPlugin::Instance()->Initialize(); +} + +/////////////////////////////////////////////////////////////////////////////// +void Shutdown() +{ + RenderPlugin::Instance()->Shutdown(); +} + +/////////////////////////////////////////////////////////////////////////////// +// gpu buffer management +/////////////////////////////////////////////////////////////////////////////// +GPUBufferResource* CreateVertexBuffer( + unsigned int ByteWidth, void* pSysMem) +{ + return RenderPlugin::Instance()->CreateVertexBuffer(ByteWidth, pSysMem); +} + +/////////////////////////////////////////////////////////////////////////////// +void CopyToDevice( + GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth) +{ + RenderPlugin::Instance()->CopyToDevice(pDevicePtr, pSysMem, ByteWidth); +} + +/////////////////////////////////////////////////////////////////// +// texture resource mangement +/////////////////////////////////////////////////////////////////// +GPUShaderResource* CreateTextureResource(const char* filepath) +{ + return RenderPlugin::Instance()->CreateTextureSRV(filepath); +} + +/////////////////////////////////////////////////////////////////////////////// +void RenderShadowMap(GPUShaderResource* pShadowSRV, float znear, float zfar) +{ + // update constant buffer + ShadowVizParam shaderParam; + { + shaderParam.m_zFar = zfar; + shaderParam.m_zNear = znear; + } + CopyShaderParam(SHADER_TYPE_VISUALIZE_SHADOW, &shaderParam, sizeof(ShadowVizParam), 0); + + RenderPlugin::Instance()->BindPixelShaderResources(0, 1, &pShadowSRV); + + // render states + RenderPlugin::Instance()->ApplySampler(0, SAMPLER_TYPE_POINTCLAMP); + + RenderPlugin::Instance()->BindShaderResources(SHADER_TYPE_VISUALIZE_SHADOW, 1, &pShadowSRV); + + + RenderPlugin::Instance()->ApplyRasterizerState(RASTERIZER_STATE_FILL_CULL_NONE); + RenderPlugin::Instance()->ApplyDepthStencilState(DEPTH_STENCIL_DEPTH_NONE); + + // set IA vars + RenderPlugin::Instance()->ClearInputLayout(); + + RenderPlugin::Instance()->SetPrimitiveTopologyTriangleStrip(); + + // set shader and tex resource + ApplyShader(SHADER_TYPE_VISUALIZE_SHADOW); + + // draw quad + RenderPlugin::Instance()->Draw(3, 0); + + // cleanup shader and its resource + RenderPlugin::Instance()->ClearPixelShaderResources(0, 1); + RenderPlugin::Instance()->DisableShader(SHADER_TYPE_VISUALIZE_SHADOW); +} + +/////////////////////////////////////////////////////////////////////////////// +// render with full color shader +void RenderScreenQuad( + GPUShaderResource* pTextureSRV + ) +{ + RenderPlugin::Instance()->ApplyRasterizerState(RASTERIZER_STATE_FILL_CULL_NONE); + RenderPlugin::Instance()->ApplyDepthStencilState(DEPTH_STENCIL_DEPTH_NONE); + + RenderPlugin::Instance()->ClearInputLayout(); + + RenderPlugin::Instance()->SetPrimitiveTopologyTriangleStrip(); + + if(pTextureSRV) + { + RenderPlugin::Instance()->BindShaderResources(SHADER_TYPE_SCREEN_QUAD, 1, &pTextureSRV); + + ApplyShader(SHADER_TYPE_SCREEN_QUAD); + + RenderPlugin::Instance()->BindPixelShaderResources(0, 1, &pTextureSRV); + RenderPlugin::Instance()->ApplySampler(0, SAMPLER_TYPE_POINTCLAMP); + + RenderPlugin::Instance()->Draw(3,0); + + RenderPlugin::Instance()->ClearPixelShaderResources(0, 1); + RenderPlugin::Instance()->DisableShader(SHADER_TYPE_SCREEN_QUAD); + } + else + { + ApplyShader(SHADER_TYPE_SCREEN_QUAD_COLOR); + + RenderPlugin::Instance()->Draw(3,0); + + RenderPlugin::Instance()->DisableShader(SHADER_TYPE_SCREEN_QUAD_COLOR); + } +} + + +void SubmitGpuWork() +{ + RenderPlugin::Instance()->SubmitGpuWork(); +} + +void WaitForGpu() +{ + RenderPlugin::Instance()->WaitForGpu(); +} + + +/////////////////////////////////////////////////////////////////////////////// +// draw calls +/////////////////////////////////////////////////////////////////////////////// +void DrawLineList(GPUBufferResource* pDevicePtr, unsigned int nVerts, unsigned int stride) +{ + RenderPlugin::Instance()->SetVertexBuffer(pDevicePtr, stride); + RenderPlugin::Instance()->SetPrimitiveTopologyLineList(); + RenderPlugin::Instance()->Draw(nVerts, 0); +} + +/////////////////////////////////////////////////////////////////////////////// +// render states management +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +void ApplyDepthStencilState(DEPTH_STENCIL_STATE state) +{ + RenderPlugin::Instance()->ApplyDepthStencilState(state); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyRasterizerState(RASTERIZER_STATE state) +{ + RenderPlugin::Instance()->ApplyRasterizerState(state); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplySampler(int slot, SAMPLER_TYPE st) +{ + RenderPlugin::Instance()->ApplySampler(slot, st); +} + +/////////////////////////////////////////////////////////////////////////////// +void ApplyBlendState(BLEND_STATE st) +{ + RenderPlugin::Instance()->ApplyBlendState(st); +} + +void ApplyForShadow(int ForShadow) +{ + RenderPlugin::Instance()->ApplyForShadow(ForShadow); +} + +void SwitchToDX11() +{ + RenderPlugin::Instance()->SwitchToDX11(); +} + +void FlushDX11() +{ + RenderPlugin::Instance()->FlushDX11(); +} + +void FlushDX12() +{ + RenderPlugin::Instance()->FlushDX12(); +} + +void ApplyPrimitiveTopologyLine() +{ + RenderPlugin::Instance()->ApplyPrimitiveTopologyLine(); +} + +void ApplyPrimitiveTopologyTriangle() +{ + RenderPlugin::Instance()->ApplyPrimitiveTopologyTriangle(); +} + +/////////////////////////////////////////////////////////////////// +// shader magement +/////////////////////////////////////////////////////////////////// +void ApplyShader(SHADER_TYPE st) +{ + RenderPlugin::Instance()->ApplyShader(st); +} + +/////////////////////////////////////////////////////////////////////////////// +void CopyShaderParam(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot) +{ + RenderPlugin::Instance()->CopyShaderParam(st, pSysMem, bytes, slot); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Viewport magement +///////////////////////////////////////////////////////////////////////////////////////// +void GetViewport(Viewport& vp) +{ + RenderPlugin::Instance()->GetViewport(vp); +} + +/////////////////////////////////////////////////////////////////////////////// +void SetViewport(const Viewport& vp) +{ + RenderPlugin::Instance()->SetViewport(vp); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Render window interafce +///////////////////////////////////////////////////////////////////////////////////////// +bool CreateRenderWindow(HWND hWnd, int nSamples) +{ + return RenderPlugin::Instance()->CreateRenderWindow(hWnd, nSamples); +} + +bool ResizeRenderWindow(int w, int h) +{ + return RenderPlugin::Instance()->ResizeRenderWindow(w,h); +} + +void PresentRenderWindow() +{ + return RenderPlugin::Instance()->PresentRenderWindow(); +} + +void ClearRenderWindow(float r, float g, float b) +{ + return RenderPlugin::Instance()->ClearRenderWindow(r,g,b); +} + +/////////////////////////////////////////////////////////////////////////////// +// Texture resource management +/////////////////////////////////////////////////////////////////////////////// +static GPUShaderResource* g_backgroundTextureSRV = 0; + +bool LoadBackgroundTexture(const char* filePath) +{ + ClearBackgroundTexture(); + + RenderPlugin::Instance()->PreRender(); + g_backgroundTextureSRV = RenderPlugin::Instance()->CreateTextureSRV(filePath); + RenderPlugin::Instance()->PostRender(); + + return (g_backgroundTextureSRV != 0); +} + +/////////////////////////////////////////////////////////////////////////////// +void RenderBackgroundTexture() +{ + RenderScreenQuad(g_backgroundTextureSRV); +} + +/////////////////////////////////////////////////////////////////////////////// +void ClearBackgroundTexture() +{ + SAFE_RELEASE(g_backgroundTextureSRV); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Text draw helper functions (using DXUT) +///////////////////////////////////////////////////////////////////////////////////////// +void TxtHelperBegin() +{ + RenderPlugin::Instance()->TxtHelperBegin(); +} + +void TxtHelperEnd() +{ + RenderPlugin::Instance()->TxtHelperEnd(); +} + +void TxtHelperSetInsertionPos(int x, int y) +{ + RenderPlugin::Instance()->TxtHelperSetInsertionPos(x,y); +} + +void TxtHelperSetForegroundColor(float r, float g, float b, float a) +{ + RenderPlugin::Instance()->TxtHelperSetForegroundColor(r,g,b,a); +} + +void TxtHelperDrawTextLine(wchar_t* str) +{ + RenderPlugin::Instance()->TxtHelperDrawTextLine(str); +} + +} // end namespace
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.h b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.h new file mode 100644 index 0000000..9bc4036 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.h @@ -0,0 +1,175 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "windows.h" + +#include "RenderResources.h" + +// API agnostic interface for rendering +namespace RenderInterface +{ + /////////////////////////////////////////////////////////////////// + enum RASTERIZER_STATE + { + RASTERIZER_STATE_FILL_CULL_NONE, + RASTERIZER_STATE_FILL_CULL_FRONT, + RASTERIZER_STATE_FILL_CULL_BACK, + RASTERIZER_STATE_WIRE, + RASTERIZER_STATE_END + }; + + /////////////////////////////////////////////////////////////////// + enum DEPTH_STENCIL_STATE + { + DEPTH_STENCIL_DEPTH_TEST, + DEPTH_STENCIL_DEPTH_NONE, + DEPTH_STENCIL_STATE_END + }; + + /////////////////////////////////////////////////////////////////// + enum SAMPLER_TYPE + { + SAMPLER_TYPE_LINEAR, + SAMPLER_TYPE_POINTCLAMP, + SAMPLER_TYPE_END, + }; + + /////////////////////////////////////////////////////////////////// + enum BLEND_STATE + { + BLEND_STATE_ALPHA, + BLEND_STATE_NONE, + BLEND_STATE_END + }; + + /////////////////////////////////////////////////////////////////// + enum SHADER_TYPE + { + SHADER_TYPE_MESH_RENDERING, + SHADER_TYPE_MESH_SHADOW, + SHADER_TYPE_SCREEN_QUAD, + SHADER_TYPE_SCREEN_QUAD_COLOR, + SHADER_TYPE_VISUALIZE_SHADOW, + SHADER_TYPE_SIMPLE_COLOR, +#ifndef NV_ARTISTTOOLS + SHADER_TYPE_HAIR_SHADER_DEFAULT, + SHADER_TYPE_HAIR_SHADER_SHADOW, +#endif // NV_ARTISTTOOLS + }; + + /////////////////////////////////////////////////////////////////// + // global acess for render context and device to minimize D3D entry points + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT bool InitDevice(int deviceID); + CORELIB_EXPORT bool Initialize(); + CORELIB_EXPORT void Shutdown(); + + CORELIB_EXPORT void SubmitGpuWork(); + CORELIB_EXPORT void WaitForGpu(); + + /////////////////////////////////////////////////////////////////// + // render window management + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT bool CreateRenderWindow(HWND hWnd, int nSamples); + CORELIB_EXPORT bool ResizeRenderWindow(int w, int h); + CORELIB_EXPORT void PresentRenderWindow(); + CORELIB_EXPORT void ClearRenderWindow(float r, float g, float b); + + /////////////////////////////////////////////////////////////////// + // shader magement + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT void ApplyShader(SHADER_TYPE st); + CORELIB_EXPORT void CopyShaderParam(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot = 0); + + /////////////////////////////////////////////////////////////////// + // viewport management + /////////////////////////////////////////////////////////////////// + struct Viewport + { + float TopLeftX; + float TopLeftY; + float Width; + float Height; + float MinDepth; + float MaxDepth; + }; + + CORELIB_EXPORT void GetViewport(Viewport& vp); + CORELIB_EXPORT void SetViewport(const Viewport& vp); + + /////////////////////////////////////////////////////////////////// + // gpu buffer management + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT GPUBufferResource* CreateVertexBuffer( unsigned int ByteWidth, void* pSysMem = 0); + CORELIB_EXPORT void CopyToDevice(GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth); + + /////////////////////////////////////////////////////////////////// + // texture resource mangement + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT GPUShaderResource* CreateTextureResource(const char* filePath); + CORELIB_EXPORT void RenderShadowMap(GPUShaderResource* pShadowSRV, float znear, float zfar); + + /////////////////////////////////////////////////////////////////// + // render state management + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT void ApplyDepthStencilState(DEPTH_STENCIL_STATE state); + CORELIB_EXPORT void ApplyRasterizerState(RASTERIZER_STATE state); + CORELIB_EXPORT void ApplySampler(int slot, SAMPLER_TYPE st); + CORELIB_EXPORT void ApplyBlendState(BLEND_STATE st); + + CORELIB_EXPORT void ApplyForShadow(int ForShadow); + CORELIB_EXPORT void SwitchToDX11(); + CORELIB_EXPORT void FlushDX11(); + CORELIB_EXPORT void FlushDX12(); + CORELIB_EXPORT void ApplyPrimitiveTopologyLine(); + CORELIB_EXPORT void ApplyPrimitiveTopologyTriangle(); + /////////////////////////////////////////////////////////////////// + // draw calls + /////////////////////////////////////////////////////////////////// + void DrawLineList(GPUBufferResource* pVertexBuffer, unsigned int nVerts, unsigned int bytesize); + + /////////////////////////////////////////////////////////////////// + // background textures + /////////////////////////////////////////////////////////////////// + bool LoadBackgroundTexture(const char* filePath); + void RenderBackgroundTexture(); + void ClearBackgroundTexture(); + + /////////////////////////////////////////////////////////////////// + CORELIB_EXPORT bool GetDeviceInfoString(wchar_t *str); + + /////////////////////////////////////////////////////////////////// + // text helpers + CORELIB_EXPORT void TxtHelperBegin(); + CORELIB_EXPORT void TxtHelperEnd(); + CORELIB_EXPORT void TxtHelperSetInsertionPos(int x, int y); + CORELIB_EXPORT void TxtHelperSetForegroundColor(float r, float g, float b, float a = 1.0f); + CORELIB_EXPORT void TxtHelperDrawTextLine(wchar_t* str); +} diff --git a/tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.cpp b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.cpp new file mode 100644 index 0000000..3df8c85 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.cpp @@ -0,0 +1,86 @@ +#include "RenderPlugin.h" + +#include <io.h> +#include <stdio.h> +#include <stdlib.h> + +RenderPlugin* g_Plugin = nullptr; + +RenderPlugin::RenderPlugin() +{ + m_RenderApi = ""; +} + +typedef RenderPlugin*(*Func)(void); + +bool RenderPlugin::Load(std::vector<std::string>& render_plugins) +{ + if (render_plugins.size() == 0) + { + return false; + } + + std::vector<std::string>::iterator it; + std::string pluginDll = ""; + HMODULE module = NULL; + Func CreateFunc = NULL; + bool loaded = false; + for (it = render_plugins.begin(); it != render_plugins.end(); it++) + { +#ifdef NV_ARTISTTOOLS + pluginDll = "RenderPlugin"; +#else + pluginDll = "FurRender"; +#endif + + pluginDll.append(*it); + +#ifdef _WIN64 + pluginDll.append(".win64"); +#else + pluginDll.append(".win32"); +#endif + +#ifdef _DEBUG + pluginDll.append(".d"); +#else +#endif + + pluginDll.append(".dll"); + + module = LoadLibraryA(pluginDll.c_str()); + if (NULL == module) + return false; + + CreateFunc = (Func)GetProcAddress(module, "CreateRenderPlugin"); + if (NULL == CreateFunc) + return false; + + g_Plugin = CreateFunc(); + if (NULL != g_Plugin) + { + loaded = true; + break; + } + } + return loaded; +} + +RenderPlugin::~RenderPlugin() +{ +} + + +RenderPlugin* RenderPlugin::Instance() +{ + return g_Plugin; +} + +void RenderPlugin::Destroy() +{ + if (nullptr == g_Plugin) + return; + + delete g_Plugin; + g_Plugin = nullptr; +} diff --git a/tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.h b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.h new file mode 100644 index 0000000..e755aea --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.h @@ -0,0 +1,124 @@ +#pragma once + +#include "RenderInterface.h" +using namespace RenderInterface; + +class NVHairReadOnlyBuffer; +class GPUProfiler; +class ShadowMap; + +class IDXGIAdapter; +class IUnknown; +class IDXGIFactory1; +class IDXGISwapChain; + +struct D3DHandles +{ +public: + IDXGIAdapter* pAdapter; + IDXGIFactory1* pFactory; + IUnknown* pDevice; + IUnknown* pDeviceContext; + + IDXGISwapChain* pDXGISwapChain; + IUnknown* pD3D11BackBuffer; + IUnknown* pD3D11RenderTargetView; + IUnknown* pD3D11DepthBuffer; + IUnknown* pD3D11DepthStencilView; +}; + +#ifdef CORERENDER_LIB +# define CORERENDER_EXPORT Q_DECL_EXPORT +#else +# define CORERENDER_EXPORT Q_DECL_IMPORT +#endif + +class CORELIB_EXPORT RenderPlugin +{ +public: + static bool Load(std::vector<std::string>& render_plugins); + static RenderPlugin* Instance(); + static void Destroy(); + + ~RenderPlugin(); + + // self + virtual std::string GetRenderApi() { return m_RenderApi; } + + // interface + virtual bool InitDevice(int deviceID) = 0; + virtual bool Initialize() = 0; + virtual void Shutdown() = 0; + virtual void CopyToDevice(GPUBufferResource *pDevicePtr, void* pSysMem, unsigned int ByteWidth) = 0; + virtual void ApplyDepthStencilState(DEPTH_STENCIL_STATE state) = 0; + virtual void ApplyRasterizerState(RASTERIZER_STATE state) = 0; + virtual void ApplySampler(int slot, SAMPLER_TYPE st) = 0; + virtual void ApplyBlendState(BLEND_STATE st) = 0; + virtual void GetViewport(Viewport& vp) = 0; + virtual void SetViewport(const Viewport& vp) = 0; + virtual void BindVertexShaderResources(int startSlot, int numSRVs, GPUShaderResource** ppSRVs) = 0; + virtual void BindPixelShaderResources(int startSlot, int numSRVs, GPUShaderResource** ppSRVs) = 0; + virtual void ClearVertexShaderResources(int startSlot, int numSRVs) = 0; + virtual void ClearPixelShaderResources(int startSlot, int numSRVs) = 0; + virtual void ClearInputLayout() = 0; + virtual void SetVertexBuffer(GPUBufferResource* pBuffer, UINT stride, UINT offset = 0) = 0; + virtual void SetPrimitiveTopologyTriangleStrip() = 0; + virtual void SetPrimitiveTopologyTriangleList() = 0; + virtual void SetPrimitiveTopologyLineList() = 0; + virtual void Draw(unsigned int vertexCount, unsigned int startCount = 0) = 0; + virtual GPUBufferResource* CreateVertexBuffer(unsigned int ByteWidth, void* pSysMem = 0) = 0; + virtual GPUShaderResource* CreateShaderResource(unsigned int stride, unsigned int numElements, void* pSysMem, NVHairReadOnlyBuffer* pReadOnlyBuffer = NULL) = 0; + + // interface dx12 + virtual void ApplyForShadow(int ForShadow) = 0; + virtual void SwitchToDX11() = 0; + virtual void FlushDX11() = 0; + virtual void FlushDX12() = 0; + virtual void ApplyPrimitiveTopologyLine() = 0; + virtual void ApplyPrimitiveTopologyTriangle() = 0; + virtual void SubmitGpuWork() = 0; + virtual void WaitForGpu() = 0; + + // util + virtual bool CreateRenderWindow(HWND hWnd, int nSamples) = 0; + virtual bool ResizeRenderWindow(int w, int h) = 0; + virtual void PresentRenderWindow() = 0; + virtual void ClearRenderWindow(float r, float g, float b) = 0; + virtual bool GetDeviceInfoString(wchar_t *str) = 0; + virtual GPUShaderResource* CreateTextureSRV(const char* texturename) = 0; + virtual void TxtHelperBegin() = 0; + virtual void TxtHelperEnd() = 0; + virtual void TxtHelperSetInsertionPos(int x, int y) = 0; + virtual void TxtHelperSetForegroundColor(float r, float g, float b, float a = 1.0f) = 0; + virtual void TxtHelperDrawTextLine(wchar_t* str) = 0; + + // shader + virtual bool InitializeShaders() = 0; + virtual void DestroyShaders() = 0; + virtual void ApplyShader(SHADER_TYPE st) = 0; + virtual void DisableShader(SHADER_TYPE st) = 0; + virtual void BindShaderResources(SHADER_TYPE st, int numSRVs, GPUShaderResource** ppSRVs) = 0; + virtual void CopyShaderParam(SHADER_TYPE st, void* pSysMem, unsigned int bytes, unsigned int slot = 0) = 0; + + // GPUProfiler + virtual GPUProfiler* CreateGPUProfiler() = 0; + + // ShadowMap + virtual ShadowMap* CreateShadowMap(int resolution) = 0; + + // D3D12RenderContext + virtual void PreRender() = 0; + virtual void PostRender() = 0; + + // GPUMeshResources + virtual GPUMeshResources* GPUMeshResourcesCreate(MeshData* pMeshData, const SkinData& skinData) = 0; + virtual void GPUMeshResourcesRelease(GPUMeshResources* pResource) = 0; + + // Get devices related + virtual D3DHandles& GetDeviceHandles(D3DHandles& deviceHandles) = 0; + +protected: + RenderPlugin(); + std::string m_RenderApi; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.cpp b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.cpp new file mode 100644 index 0000000..19863fc --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.cpp @@ -0,0 +1,47 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "RenderResources.h" + +// shared path +#include "AnimUtil.h" +#include "MeshData.h" + +#include "RenderPlugin.h" + +//////////////////////////////////////////////////////////////////////////////////////// +GPUMeshResources* GPUMeshResources::Create(MeshData* pMeshData, const SkinData& skinData) +{ + return RenderPlugin::Instance()->GPUMeshResourcesCreate(pMeshData, skinData); +} + +//////////////////////////////////////////////////////////////////////////////////////// +void GPUMeshResources::Release() +{ + RenderPlugin::Instance()->GPUMeshResourcesRelease(this); +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.h b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.h new file mode 100644 index 0000000..c261730 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.h @@ -0,0 +1,72 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#pragma once + +#include "corelib_global.h" +#include "CoreLib.h" + +#ifndef SAFE_RELEASE +#define SAFE_RELEASE(x) { if (x) x->Release(); x = 0; } +#endif + +////////////////////////////////////////////////////////////////////////////////////// +// API specific GPU resources (todo - add reference counting) +////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////// +class GPUBufferResource +{ +public: + virtual ~GPUBufferResource() {} + virtual void Release() = 0; +}; + +//////////////////////////////////////////////////////////////////////////////////////// +class GPUShaderResource +{ +public: + virtual ~GPUShaderResource() {} + virtual void Release() = 0; +}; + +class MeshData; +class SkinData; + +//////////////////////////////////////////////////////////////////////////////////////// +class GPUMeshResources +{ +public: + GPUBufferResource* m_pVertexBuffer; + GPUShaderResource* m_pBoneIndicesSRV; + GPUShaderResource* m_pBoneWeightsSRV; + + static GPUMeshResources* Create(MeshData*, const SkinData& skinData); + void Release(); +}; + + diff --git a/tools/ArtistTools/source/CoreLib/Render/LightShaderParam.h b/tools/ArtistTools/source/CoreLib/Render/LightShaderParam.h new file mode 100644 index 0000000..9935f71 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/LightShaderParam.h @@ -0,0 +1,83 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "MathUtil.h" + +#define MAX_LIGHTS 4 + +// shader parameter for light +struct LightParam +{ + int m_enable; + atcore_float3 m_dir; + + int m_useShadows; + atcore_float3 m_color; + + atcore_float3 m_ambientColor; + int m_isEnvLight; + + int m_lhs; + int _reserved1; + int _reserved2; + int _reserved3; + + float m_depthBias; + float m_depthGain; + int m_useEnvMap; + float m_intensity; + + atcore_float4x4 m_viewMatrix; + atcore_float4x4 m_lightMatrix; + +public: + LightParam() + { + m_dir = gfsdk_makeFloat3(-1.0f, -1.0f, -1.0f); + m_enable = 0; + m_useShadows = false; + m_isEnvLight = 0; + m_useEnvMap = 0; + + m_depthBias = 1.0f; + m_depthGain = 1.0f; + + m_color = gfsdk_makeFloat3(1.0f, 1.0f, 1.0f); + m_ambientColor = gfsdk_makeFloat3(0.0f, 0.0f, 0.0f); + } +}; + + +// light shader block in c-buffer +struct LightShaderParam +{ + LightParam m_lightParam[MAX_LIGHTS]; +}; + diff --git a/tools/ArtistTools/source/CoreLib/Render/MeshShaderParam.h b/tools/ArtistTools/source/CoreLib/Render/MeshShaderParam.h new file mode 100644 index 0000000..5dce51d --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/MeshShaderParam.h @@ -0,0 +1,142 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "MathUtil.h" +#include "LightShaderParam.h" + +// same layout as the constant buffer used in body shader +#define MAX_BONE_MATRICES 512 + +// shared struct for mesh shader cbuffer and material access +struct MeshShaderParam +{ + atcore_float4x4 m_ViewProjection; + atcore_float4x4 m_BodyTransformation; + + LightShaderParam m_lightParam; + + atcore_float3 m_eyePosition; + float m_specularShininess; + + int m_useDiffuseTextures; + int m_useSpecularTextures; + int m_useNormalTextures; + int m_useTextures; + + + atcore_float4 m_ambientColor; + atcore_float4 m_diffuseColor; + atcore_float4 m_specularColor; + + int m_wireFrame; + int m_useLighting; + int m_wireFrameOver; + float m_unitScale; + + int m_useDQs; + int m_diffuseChannel; + int m_flatNormal; + int m_usePinPos; + + atcore_float4x4 m_boneMatrices[MAX_BONE_MATRICES]; + atcore_dualquaternion m_boneDQs[MAX_BONE_MATRICES]; + + MeshShaderParam() + { + m_specularShininess = 30.0f; + + m_ambientColor = gfsdk_makeFloat4(0.0f, 0.0f, 0.0f, 1.0f); + m_diffuseColor = gfsdk_makeFloat4(1.0f, 1.0f, 1.0f, 1.0f); + m_specularColor = gfsdk_makeFloat4(0.0f, 0.0f, 0.0f, 0.0f); + + m_useDiffuseTextures = true; + m_useSpecularTextures = true; + m_useNormalTextures = true; + m_useTextures = true; + + m_wireFrame = false; + m_wireFrameOver = false; + m_useLighting = true; + m_unitScale = 1.0f; + + m_useDQs = false; + m_flatNormal = false; + + m_usePinPos = false; + + memset(m_boneMatrices, 0, sizeof(atcore_float4x4) * MAX_BONE_MATRICES); + memset(m_boneDQs, 0, sizeof(atcore_dualquaternion) * MAX_BONE_MATRICES); + } +}; + +// struct for mesh shadow shader cbuffer +struct MeshShadowShaderParam +{ + atcore_float4x4 m_ViewProjection; + atcore_float4x4 m_ViewMatrix; + atcore_float4x4 m_BodyTransformation; + + int m_useDQs; + int m_usePinPos; + float _reserved_[2]; + + atcore_float4x4 m_boneMatrices[MAX_BONE_MATRICES]; + atcore_dualquaternion m_boneDQs[MAX_BONE_MATRICES]; + + MeshShadowShaderParam() + { + m_useDQs = false; + m_usePinPos = false; + + memset(m_boneMatrices, 0, sizeof(atcore_float4x4) * MAX_BONE_MATRICES); + memset(m_boneDQs, 0, sizeof(atcore_dualquaternion) * MAX_BONE_MATRICES); + } +}; + +struct SimpleShaderParam +{ + atcore_float4x4 world; + atcore_float4x4 view; + atcore_float4x4 projection; + atcore_float4 color; + + int useVertexColor; + int dummy2; + int dummy3; + int dummy4; +}; + +struct ShadowVizParam +{ + float m_zNear; + float m_zFar; + float _align1; + float _align2; +};
\ No newline at end of file diff --git a/tools/ArtistTools/source/CoreLib/Render/ShadowMap.cpp b/tools/ArtistTools/source/CoreLib/Render/ShadowMap.cpp new file mode 100644 index 0000000..72b90be --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/ShadowMap.cpp @@ -0,0 +1,36 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#include "ShadowMap.h" + +#include "RenderPlugin.h" + +///////////////////////////////////////////////////////////////////////// +ShadowMap* ShadowMap::Create(int resolution) +{ + return RenderPlugin::Instance()->CreateShadowMap(resolution); +} diff --git a/tools/ArtistTools/source/CoreLib/Render/ShadowMap.h b/tools/ArtistTools/source/CoreLib/Render/ShadowMap.h new file mode 100644 index 0000000..9a62b06 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/ShadowMap.h @@ -0,0 +1,48 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#pragma once + +#include "d3d11.h" + +class GPUShaderResource; + +struct ShadowMap +{ +public: + static ShadowMap* ShadowMap::Create(int resolution); + virtual ~ShadowMap() {} + + virtual void Release() = 0; + virtual void BeginRendering(float clearDepth) = 0; + virtual void EndRendering() = 0; + + virtual GPUShaderResource* GetShadowSRV() = 0; +}; + + diff --git a/tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.cpp b/tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.cpp new file mode 100644 index 0000000..0dfb169 --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.cpp @@ -0,0 +1,493 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013-2015 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// + +#include "SimpleRenderable.h" + +#include "RenderInterface.h" + +#include <vector> + +#include "Nv.h" + +static std::vector<SimpleRenderable*> g_SimpleShapes; + +struct DefaultVertexType +{ + atcore_float3 pos; + atcore_float4 color; +}; + +/////////////////////////////////////////////////////////////////////////////// +SimpleRenderable::SimpleRenderable() + : m_pVertexBuffer(NV_NULL) + , m_numIndices(0) + , m_numVertices(0) +{ + +} + +/////////////////////////////////////////////////////////////////////////////// +SimpleRenderable::~SimpleRenderable() +{ + Free(); +} + +/////////////////////////////////////////////////////////////////////////////// +void SimpleRenderable::Free() +{ + SAFE_RELEASE(m_pVertexBuffer); +} + +/////////////////////////////////////////////////////////////////////////////// +bool SimpleRenderable::Initialize() +{ + ////////////////////////////////////////////////////////////////////////////// + // create icon shape + g_SimpleShapes.resize(NUM_SHAPE_TYPES); + + g_SimpleShapes[GROUND_YUP] = new SimpleRenderable; + g_SimpleShapes[GROUND_YUP]->InitGroundGeometry(false); + + g_SimpleShapes[GROUND_ZUP] = new SimpleRenderable; + g_SimpleShapes[GROUND_ZUP]->InitGroundGeometry(true); + + g_SimpleShapes[AXIS_YUP] = new SimpleRenderable; + g_SimpleShapes[AXIS_YUP]->InitAxisGeometry(false); + + g_SimpleShapes[AXIS_ZUP] = new SimpleRenderable; + g_SimpleShapes[AXIS_ZUP]->InitAxisGeometry(true); + + g_SimpleShapes[WIND_YUP] = new SimpleRenderable; + g_SimpleShapes[WIND_YUP]->InitWindGeometry(); + + g_SimpleShapes[WIND_ZUP] = new SimpleRenderable; + g_SimpleShapes[WIND_ZUP]->InitWindGeometry(); + + g_SimpleShapes[LIGHT] = new SimpleRenderable; + g_SimpleShapes[LIGHT]->InitLightGeometry(); + + g_SimpleShapes[LIGHT_RAY] = new SimpleRenderable; + g_SimpleShapes[LIGHT_RAY]->InitLightRayGeometry(); + + return true; +} + +///////////////////////////////////////////////////////////////////////////////////////////// +void SimpleRenderable::Draw(SHAPE_TYPE t, bool depthTest) +{ + if (t >= g_SimpleShapes.size()) + return; + + g_SimpleShapes[t]->Draw(depthTest); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +void SimpleRenderable::Shutdown() +{ + for (int i = 0; i < g_SimpleShapes.size(); i++) + { + if (g_SimpleShapes[i]) + { + g_SimpleShapes[i]->Free(); + delete g_SimpleShapes[i]; + } + } + + g_SimpleShapes.clear(); +} + +/////////////////////////////////////////////////////////////////////////////// +bool SimpleRenderable::InitGroundGeometry(bool zUP) +{ + const int nSeed = 10; + const int nRow = nSeed * 2 + 1; + const int nLines = nRow * 2; + const float fLen = 25.0f; + const float fSpace = fLen/nSeed; + float groundHeight = 0.0f; + + const atcore_float4 color1 = gfsdk_makeFloat4(0.65, 0.65, 0.65, 1.0f); + const atcore_float4 color2 = gfsdk_makeFloat4(0.1f, 0.1f, 0.1f, 1.0f); + + DWORD offset; + + const int numVerts = nLines * 2; + DefaultVertexType* buf = new DefaultVertexType[numVerts]; + DefaultVertexType* pData = buf; + + //build ground lines/verts + for(int i = 0; i < nSeed; i++) + { + if ( zUP ) + { + // lines parallel to y + pData->pos = gfsdk_makeFloat3(-fSpace * (i+1), -fLen, groundHeight); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(-fSpace * (i+1), fLen, groundHeight); + pData->color = color1; + pData++; + + // lines parallel to y + pData->pos = gfsdk_makeFloat3(fSpace * (i+1), -fLen, groundHeight); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(fSpace * (i+1), fLen, groundHeight); + pData->color = color1; + pData++; + + // line x + pData->pos = gfsdk_makeFloat3(-fLen, -fSpace * (i+1), groundHeight); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(fLen, -fSpace * (i+1), groundHeight); + pData->color = color1; + pData++; + + // line x + pData->pos = gfsdk_makeFloat3(-fLen, fSpace * (i+1), groundHeight); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(fLen, fSpace * (i+1), groundHeight); + pData->color = color1; + pData++; + } + else + { + // lines parallel to z + pData->pos = gfsdk_makeFloat3(-fSpace * (i+1), groundHeight, -fLen); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(-fSpace * (i+1), groundHeight, fLen); + pData->color = color1; + pData++; + + // lines parallel to z + pData->pos = gfsdk_makeFloat3(fSpace * (i+1), groundHeight, -fLen); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(fSpace * (i+1), groundHeight, fLen); + pData->color = color1; + pData++; + + // line x + pData->pos = gfsdk_makeFloat3(-fLen, groundHeight, -fSpace * (i+1)); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(fLen, groundHeight, -fSpace * (i+1)); + pData->color = color1; + pData++; + + // line x + pData->pos = gfsdk_makeFloat3(-fLen, groundHeight, fSpace * (i+1)); + pData->color = color1; + pData++; + + pData->pos = gfsdk_makeFloat3(fLen, groundHeight, fSpace * (i+1)); + pData->color = color1; + pData++; + } + } + + if ( zUP ) + { + // line y + pData->pos = gfsdk_makeFloat3(-fLen, 0.0f, groundHeight); + pData->color = color2; + pData++; + + pData->pos = gfsdk_makeFloat3(fLen, 0.0f, groundHeight); + pData->color = color2; + pData++; + + // line x + pData->pos = gfsdk_makeFloat3(0.0f, -fLen, groundHeight); + pData->color = color2; + pData++; + + pData->pos = gfsdk_makeFloat3(0.0f, fLen, groundHeight); + pData->color = color2; + pData++; + } + else + { + // line z + pData->pos = gfsdk_makeFloat3(-fLen, groundHeight, 0.0f); + pData->color = color2; + pData++; + + pData->pos = gfsdk_makeFloat3(fLen, groundHeight, 0.0f); + pData->color = color2; + pData++; + + // line x + pData->pos = gfsdk_makeFloat3(0.0f, groundHeight, -fLen); + pData->color = color2; + pData++; + + pData->pos = gfsdk_makeFloat3(0.0f, groundHeight, fLen); + pData->color = color2; + pData++; + } + + int bufBytes = sizeof(DefaultVertexType) * numVerts; + + m_pVertexBuffer = RenderInterface::CreateVertexBuffer(bufBytes, buf); + + m_numVertices = numVerts; + + return (NV_NULL != m_pVertexBuffer); +} + +/////////////////////////////////////////////////////////////////////////////// +bool SimpleRenderable::InitAxisGeometry(bool zUP) +{ + const atcore_float4 colorRed = gfsdk_makeFloat4(1.0f, 0, 0, 1.0f); + const atcore_float4 colorGreen = gfsdk_makeFloat4(0, 1.0f, 0, 1.0f); + const atcore_float4 colorBlue = gfsdk_makeFloat4(0, 0, 1.0f, 1.0f); + const float dist = 1.0f; + const int numVerts = 3 * 2; + DefaultVertexType* buf = new DefaultVertexType[numVerts]; + DefaultVertexType* pData = buf; + + { + // x axis + pData->pos = gfsdk_makeFloat3(0, 0, 0); + pData->color = colorRed; + pData++; + + pData->pos = gfsdk_makeFloat3(dist, 0, 0); + pData->color = colorRed; + pData++; + + // y axis + pData->pos = gfsdk_makeFloat3(0, 0, 0); + pData->color = colorGreen; + pData++; + + pData->pos = gfsdk_makeFloat3(0, dist, 0); + pData->color = colorGreen; + pData++; + + // z axis + pData->pos = gfsdk_makeFloat3(0, 0, 0); + pData->color = colorBlue; + pData++; + + pData->pos = gfsdk_makeFloat3(0, 0, dist); + pData->color = colorBlue; + pData++; + } + + int bufBytes = sizeof(DefaultVertexType) * numVerts; + + m_pVertexBuffer = RenderInterface::CreateVertexBuffer(bufBytes, buf); + + m_numVertices = numVerts; + + return (NV_NULL != m_pVertexBuffer); +} + +/////////////////////////////////////////////////////////////////////////////// +bool SimpleRenderable::InitLightGeometry() +{ + // The following geometry data are generated by external/ObjLoad tool +#include "GeometryData/LightGeometryData.h" + const atcore_float4 colorYellow = gfsdk_makeFloat4(1.0f, 1.0f, 0, 1.0f); + const int numVerts = num_faces*3*2; + DefaultVertexType* buf = new DefaultVertexType[numVerts]; + DefaultVertexType* pData = buf; + + const float modelScale = 0.25f; + for (int fi = 0; fi < num_faces; ++fi) + { + float* v0 = &vertices[(fi*3+0)*8]; + float* v1 = &vertices[(fi*3+1)*8]; + float* v2 = &vertices[(fi*3+2)*8]; + + // flip Y + v0[2] *= -1; + v1[2] *= -1; + v2[2] *= -1; + + // line 0 + pData->pos = modelScale * gfsdk_makeFloat3(v0[0], v0[1], v0[2]); + pData->color = colorYellow; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v1[0], v1[1], v1[2]); + pData->color = colorYellow; + pData++; + + // line 1 + pData->pos = modelScale * gfsdk_makeFloat3(v1[0], v1[1], v1[2]); + pData->color = colorYellow; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v2[0], v2[1], v2[2]); + pData->color = colorYellow; + pData++; + + // line 2 + pData->pos = modelScale * gfsdk_makeFloat3(v2[0], v2[1], v2[2]); + pData->color = colorYellow; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v0[0], v0[1], v0[2]); + pData->color = colorYellow; + pData++; + } + + int bufBytes = sizeof(DefaultVertexType) * numVerts; + + m_pVertexBuffer = RenderInterface::CreateVertexBuffer(bufBytes, buf); + + m_numVertices = numVerts; + + return (NV_NULL != m_pVertexBuffer); +} + + +/////////////////////////////////////////////////////////////////////////////// +bool SimpleRenderable::InitLightRayGeometry() +{ + const atcore_float4 colorRed = gfsdk_makeFloat4(1.0f, 0, 0, 1.0f); + const int numVerts = 2; + DefaultVertexType* buf = new DefaultVertexType[numVerts]; + DefaultVertexType* pData = buf; + + pData->pos = gfsdk_makeFloat3(0, 0, 0); + pData->color = colorRed; + pData++; + + pData->pos = gfsdk_makeFloat3(0, 0, 0); + pData->color = colorRed; + pData++; + + int bufBytes = sizeof(DefaultVertexType) * numVerts; + + m_pVertexBuffer = RenderInterface::CreateVertexBuffer(bufBytes, buf); + + m_numVertices = numVerts; + + return (NV_NULL != m_pVertexBuffer); +} + +/////////////////////////////////////////////////////////////////////////////// +bool SimpleRenderable::InitWindGeometry() +{ + // The following geometry data are generated by external/ObjLoad tool +#include "GeometryData/WindGeometryData.h" + const atcore_float4 colorBlue = gfsdk_makeFloat4(0, 0, 1.0f, 1.0f); + const int numVerts = num_faces*3*2; + DefaultVertexType* buf = new DefaultVertexType[numVerts]; + DefaultVertexType* pData = buf; + + const float modelScale = 0.5f; + for (int fi = 0; fi < num_faces; ++fi) + { + float* v0 = &vertices[(fi*3+0)*8]; + float* v1 = &vertices[(fi*3+1)*8]; + float* v2 = &vertices[(fi*3+2)*8]; + + pData->pos = modelScale * gfsdk_makeFloat3(v0[0], v0[1], v0[2]); + pData->color = colorBlue; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v1[0], v1[1], v1[2]); + pData->color = colorBlue; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v1[0], v1[1], v1[2]); + pData->color = colorBlue; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v2[0], v2[1], v2[2]); + pData->color = colorBlue; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v2[0], v2[1], v2[2]); + pData->color = colorBlue; + pData++; + + pData->pos = modelScale * gfsdk_makeFloat3(v0[0], v0[1], v0[2]); + pData->color = colorBlue; + pData++; + } + + int bufBytes = sizeof(DefaultVertexType) * numVerts; + + m_pVertexBuffer = RenderInterface::CreateVertexBuffer(bufBytes, buf); + + m_numVertices = numVerts; + + return (NV_NULL != m_pVertexBuffer); +} + +/////////////////////////////////////////////////////////////////////////////// +void SimpleRenderable::Draw(bool depthTest) +{ + RenderInterface::ApplyPrimitiveTopologyLine(); + + RenderInterface::ApplyShader(RenderInterface::SHADER_TYPE_SIMPLE_COLOR); + RenderInterface::DrawLineList(m_pVertexBuffer, m_numVertices, sizeof(DefaultVertexType)); + + RenderInterface::FlushDX12(); + RenderInterface::ApplyPrimitiveTopologyTriangle(); +} + +/////////////////////////////////////////////////////////////////////////////// +void SimpleRenderable::DrawLine(const atcore_float3& from, const atcore_float3& to) +{ + SimpleRenderable* pShape = g_SimpleShapes[LIGHT_RAY]; + + DefaultVertexType buf[2]; + DefaultVertexType* pData = buf; + + // start position + pData->pos = from; + pData->color = gfsdk_makeFloat4(1.0f, 1.0f, 0, 1.0f); + pData++; + + // end position + pData->pos = to; + pData->color = gfsdk_makeFloat4(1.0f, 1.0f, 0, 1.0f); + pData++; + + RenderInterface::CopyToDevice(pShape->m_pVertexBuffer, buf, 2 * sizeof(DefaultVertexType)); + + pShape->Draw(true); +} + diff --git a/tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.h b/tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.h new file mode 100644 index 0000000..c43c07d --- /dev/null +++ b/tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.h @@ -0,0 +1,75 @@ +// This code contains NVIDIA Confidential Information and is disclosed +// under the Mutual Non-Disclosure Agreement. +// +// Notice +// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES +// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +// +// NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless +// expressly authorized by NVIDIA. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2013 NVIDIA Corporation. All rights reserved. +// +// NVIDIA Corporation and its licensors retain all intellectual property and proprietary +// rights in and to this software and related documentation and any modifications thereto. +// Any use, reproduction, disclosure or distribution of this software and related +// documentation without an express license agreement from NVIDIA Corporation is +// strictly prohibited. +// +#pragma once + +#include "MathUtil.h" + +class GPUBufferResource; + +class SimpleRenderable +{ +public: + enum SHAPE_TYPE + { + GROUND_YUP, + GROUND_ZUP, + AXIS_YUP, + AXIS_ZUP, + WIND_YUP, + WIND_ZUP, + LIGHT, + LIGHT_RAY, + NUM_SHAPE_TYPES + }; + + static bool Initialize(); + static void Shutdown(); + static void Draw(SHAPE_TYPE t, bool depthTest = true); + static void DrawLine(const atcore_float3& from, const atcore_float3& to); + +protected: + GPUBufferResource* m_pVertexBuffer; + + unsigned int m_numVertices; + unsigned int m_numIndices; + + SimpleRenderable(); + ~SimpleRenderable(); + + bool InitGroundGeometry(bool zUp); + bool InitAxisGeometry(bool zUp); + bool InitLightGeometry(); + bool InitLightRayGeometry(); + bool InitWindGeometry(); + + void Draw(bool depthTest = true); + + void Free(); + +}; + |