aboutsummaryrefslogtreecommitdiff
path: root/tools/ArtistTools/source/CoreLib/Render
diff options
context:
space:
mode:
authorBryan Galdrikian <[email protected]>2017-02-24 09:32:20 -0800
committerBryan Galdrikian <[email protected]>2017-02-24 09:32:20 -0800
commite1bf674c16e3c8472b29574159c789cd3f0c64e0 (patch)
tree9f0cfce09c71a2c27ff19589fcad6cd83504477c /tools/ArtistTools/source/CoreLib/Render
parentfirst commit (diff)
downloadblast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.tar.xz
blast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.zip
Updating to [email protected] and [email protected] with a new directory structure.
NvBlast folder is gone, files have been moved to top level directory. README is changed to reflect this.
Diffstat (limited to 'tools/ArtistTools/source/CoreLib/Render')
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.cpp31
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Buffer.h65
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.cpp138
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11GPUProfiler.h56
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.cpp890
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderInterface.h90
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.cpp256
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RenderShader.h72
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.cpp319
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11RendererWindow.h43
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.cpp225
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Shaders.h43
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.cpp208
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11ShadowMap.h72
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.cpp29
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11TextureResource.h64
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.cpp333
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Util.h69
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.cpp33
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/D3D11Wrapper.h14
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.cpp315
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D11/RenderPluginDx11.h83
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.cpp31
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Buffer.h81
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.cpp222
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12GPUProfiler.h63
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.cpp564
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderContext.h254
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.cpp467
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderInterface.h74
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.cpp384
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderShader.h85
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.cpp371
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RenderTarget.h110
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.cpp141
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12RendererWindow.h29
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.cpp231
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Shaders.h42
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.cpp99
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12ShadowMap.h68
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.cpp29
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12TextureResource.h89
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.cpp386
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Util.h68
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.cpp33
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/D3D12Wrapper.h14
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.cpp343
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/D3D12/RenderPluginDx12.h83
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/GPUProfiler.cpp87
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/GPUProfiler.h61
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/GeometryData/BoneGeometryData.h305
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/GeometryData/LightGeometryData.h269
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/GeometryData/WindGeometryData.h2513
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.cpp351
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/Interface/RenderInterface.h175
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.cpp86
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/Interface/RenderPlugin.h124
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.cpp47
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/Interface/RenderResources.h72
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/LightShaderParam.h83
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/MeshShaderParam.h142
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/ShadowMap.cpp36
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/ShadowMap.h48
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.cpp493
-rw-r--r--tools/ArtistTools/source/CoreLib/Render/SimpleRenderable.h75
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();
+
+};
+