From f918266848ff3fc41462fd8bc406f1a69a26f906 Mon Sep 17 00:00:00 2001 From: Turanszki Janos Date: Sat, 11 Nov 2017 23:36:06 +0000 Subject: [PATCH] updated ocean simulator --- Editor/Editor.cpp | 4 +- WickedEngine/wiFFTGenerator.cpp | 34 ++++-- WickedEngine/wiFFTGenerator.h | 23 +--- WickedEngine/wiInitializer.cpp | 3 + WickedEngine/wiOcean.cpp | 208 ++++++++++++-------------------- WickedEngine/wiOcean.h | 46 +++---- WickedEngine/wiRenderer.cpp | 4 +- 7 files changed, 124 insertions(+), 198 deletions(-) diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 3bef1efc1..4d7f97189 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -952,11 +952,11 @@ void EditorComponent::Update(float dt) } if (wiInputManager::GetInstance()->down(VK_UP)) { - yDif += buttonrotSpeed; + yDif -= buttonrotSpeed; } if (wiInputManager::GetInstance()->down(VK_DOWN)) { - yDif -= buttonrotSpeed; + yDif += buttonrotSpeed; } Camera* cam = wiRenderer::getCamera(); diff --git a/WickedEngine/wiFFTGenerator.cpp b/WickedEngine/wiFFTGenerator.cpp index 2da42821e..4dba3a694 100644 --- a/WickedEngine/wiFFTGenerator.cpp +++ b/WickedEngine/wiFFTGenerator.cpp @@ -9,13 +9,15 @@ using namespace wiGraphicsTypes; -static const GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE; // todo: make dynamic +ComputeShader* CSFFT_512x512_Data_t::pRadix008A_CS = nullptr; +ComputeShader* CSFFT_512x512_Data_t::pRadix008A_CS2 = nullptr; void radix008A(CSFFT512x512_Plan* fft_plan, GPUUnorderedResource* pUAV_Dst, GPUResource* pSRV_Src, UINT thread_count, - UINT istride) + UINT istride, + GRAPHICSTHREAD threadID) { // Setup execution configuration UINT grid = thread_count / COHERENCY_GRANULARITY; @@ -46,7 +48,8 @@ void radix008A(CSFFT512x512_Plan* fft_plan, void fft_512x512_c2c(CSFFT512x512_Plan* fft_plan, GPUUnorderedResource* pUAV_Dst, GPUResource* pSRV_Dst, - GPUResource* pSRV_Src) + GPUResource* pSRV_Src, + GRAPHICSTHREAD threadID) { const UINT thread_count = fft_plan->slices * (512 * 512) / 8; GPUUnorderedResource* pUAV_Tmp = fft_plan->pUAV_Tmp; @@ -57,32 +60,32 @@ void fft_512x512_c2c(CSFFT512x512_Plan* fft_plan, UINT istride = 512 * 512 / 8; cs_cbs = fft_plan->pRadix008A_CB[0]; device->BindConstantBufferCS(&cs_cbs[0], CB_GETBINDSLOT(FFTGeneratorCB), threadID); - radix008A(fft_plan, pUAV_Tmp, pSRV_Src, thread_count, istride); + radix008A(fft_plan, pUAV_Tmp, pSRV_Src, thread_count, istride, threadID); istride /= 8; cs_cbs = fft_plan->pRadix008A_CB[1]; device->BindConstantBufferCS(&cs_cbs[0], CB_GETBINDSLOT(FFTGeneratorCB), threadID); - radix008A(fft_plan, pUAV_Dst, pSRV_Tmp, thread_count, istride); + radix008A(fft_plan, pUAV_Dst, pSRV_Tmp, thread_count, istride, threadID); istride /= 8; cs_cbs = fft_plan->pRadix008A_CB[2]; device->BindConstantBufferCS(&cs_cbs[0], CB_GETBINDSLOT(FFTGeneratorCB), threadID); - radix008A(fft_plan, pUAV_Tmp, pSRV_Dst, thread_count, istride); + radix008A(fft_plan, pUAV_Tmp, pSRV_Dst, thread_count, istride, threadID); istride /= 8; cs_cbs = fft_plan->pRadix008A_CB[3]; device->BindConstantBufferCS(&cs_cbs[0], CB_GETBINDSLOT(FFTGeneratorCB), threadID); - radix008A(fft_plan, pUAV_Dst, pSRV_Tmp, thread_count, istride); + radix008A(fft_plan, pUAV_Dst, pSRV_Tmp, thread_count, istride, threadID); istride /= 8; cs_cbs = fft_plan->pRadix008A_CB[4]; device->BindConstantBufferCS(&cs_cbs[0], CB_GETBINDSLOT(FFTGeneratorCB), threadID); - radix008A(fft_plan, pUAV_Tmp, pSRV_Dst, thread_count, istride); + radix008A(fft_plan, pUAV_Tmp, pSRV_Dst, thread_count, istride, threadID); istride /= 8; cs_cbs = fft_plan->pRadix008A_CB[5]; device->BindConstantBufferCS(&cs_cbs[0], CB_GETBINDSLOT(FFTGeneratorCB), threadID); - radix008A(fft_plan, pUAV_Dst, pSRV_Tmp, thread_count, istride); + radix008A(fft_plan, pUAV_Dst, pSRV_Tmp, thread_count, istride, threadID); } void create_cbuffers_512x512(CSFFT512x512_Plan* plan, GraphicsDevice* device, UINT slices) @@ -185,9 +188,6 @@ void fft512x512_create_plan(CSFFT512x512_Plan* plan, UINT slices) plan->slices = slices; - plan->pRadix008A_CS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fft_512x512_c2c_CS.cso", wiResourceManager::COMPUTESHADER)); - plan->pRadix008A_CS2 = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fft_512x512_c2c_v2_CS.cso", wiResourceManager::COMPUTESHADER)); - // Constants // Create 6 cbuffers for 512x512 transform @@ -218,3 +218,13 @@ void fft512x512_destroy_plan(CSFFT512x512_Plan* plan) for (int i = 0; i < 6; i++) SAFE_DELETE(plan->pRadix008A_CB[i]); } + + + +void CSFFT_512x512_Data_t::LoadShaders() +{ + + pRadix008A_CS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fft_512x512_c2c_CS.cso", wiResourceManager::COMPUTESHADER)); + pRadix008A_CS2 = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "fft_512x512_c2c_v2_CS.cso", wiResourceManager::COMPUTESHADER)); + +} diff --git a/WickedEngine/wiFFTGenerator.h b/WickedEngine/wiFFTGenerator.h index 655a57407..651eef567 100644 --- a/WickedEngine/wiFFTGenerator.h +++ b/WickedEngine/wiFFTGenerator.h @@ -1,20 +1,6 @@ #ifndef _FFT_GENERATOR_H_ #define _FFT_GENERATOR_H_ -// Copyright (c) 2011 NVIDIA Corporation. All rights reserved. -// -// TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED -// *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS -// OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT,IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA -// OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT, OR -// CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS -// OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY -// OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, -// EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// Please direct any bugs or questions to SDKFeedback@nvidia.com - #include "CommonInclude.h" #include "wiGraphicsAPI.h" @@ -29,8 +15,8 @@ typedef struct CSFFT_512x512_Data_t { - wiGraphicsTypes::ComputeShader* pRadix008A_CS; - wiGraphicsTypes::ComputeShader* pRadix008A_CS2; + static wiGraphicsTypes::ComputeShader* pRadix008A_CS; + static wiGraphicsTypes::ComputeShader* pRadix008A_CS2; // More than one array can be transformed at same time UINT slices; @@ -42,6 +28,8 @@ typedef struct CSFFT_512x512_Data_t wiGraphicsTypes::GPUBuffer* pBuffer_Tmp; wiGraphicsTypes::GPUUnorderedResource* pUAV_Tmp; wiGraphicsTypes::GPUResource* pSRV_Tmp; + + static void LoadShaders(); } CSFFT512x512_Plan; //////////////////////////////////////////////////////////////////////////////// @@ -62,7 +50,8 @@ void fft512x512_destroy_plan(CSFFT512x512_Plan* plan); void fft_512x512_c2c(CSFFT512x512_Plan* fft_plan, wiGraphicsTypes::GPUUnorderedResource* pUAV_Dst, wiGraphicsTypes::GPUResource* pSRV_Dst, - wiGraphicsTypes::GPUResource* pSRV_Src); + wiGraphicsTypes::GPUResource* pSRV_Src, + GRAPHICSTHREAD threadID); #endif // _FFT_GENERATOR_H_ diff --git a/WickedEngine/wiInitializer.cpp b/WickedEngine/wiInitializer.cpp index 217b72027..f4d697b15 100644 --- a/WickedEngine/wiInitializer.cpp +++ b/WickedEngine/wiInitializer.cpp @@ -7,6 +7,7 @@ #include "wiBackLog.h" #include "wiCpuInfo.h" #include "wiSound.h" +#include "wiOcean.h" #include "wiHelper.h" using namespace std; @@ -28,6 +29,8 @@ namespace wiInitializer wiFont::Initialize(); wiFont::SetUpStaticComponents(); + wiOcean::SetUpStatic(); + if (FAILED(wiSoundEffect::Initialize()) || FAILED(wiMusic::Initialize())) { stringstream ss(""); diff --git a/WickedEngine/wiOcean.cpp b/WickedEngine/wiOcean.cpp index 578323d4c..4762b5a56 100644 --- a/WickedEngine/wiOcean.cpp +++ b/WickedEngine/wiOcean.cpp @@ -6,7 +6,15 @@ using namespace wiGraphicsTypes; using namespace std; -static const GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE; // todo: make dynamic +ComputeShader* wiOcean::m_pUpdateSpectrumCS = nullptr; +VertexShader* wiOcean::m_pQuadVS = nullptr; +PixelShader* wiOcean::m_pUpdateDisplacementPS = nullptr; +PixelShader* wiOcean::m_pGenGradientFoldingPS = nullptr; +VertexShader* wiOcean::g_pOceanSurfVS = nullptr; +PixelShader* wiOcean::g_pWireframePS = nullptr; +PixelShader* wiOcean::g_pOceanSurfPS = nullptr; +VertexLayout* wiOcean::m_pQuadLayout = nullptr; +VertexLayout* wiOcean::g_pMeshLayout = nullptr; // Disable warning "conditional expression is constant" #pragma warning(disable:4127) @@ -207,68 +215,6 @@ wiOcean::wiOcean(const wiOceanParameter& params) wiRenderer::GetDevice()->CreateSamplerState(&sam_desc, &m_pPointSamplerState); - m_pUpdateSpectrumCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSimulatorCS.cso", wiResourceManager::COMPUTESHADER)); - - { - VertexLayoutDesc layout[] = - { - { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, 0, INPUT_PER_VERTEX_DATA, 0 }, - }; - UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanQuadVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); - if (vsinfo != nullptr) { - m_pQuadVS = vsinfo->vertexShader; - m_pQuadLayout = vsinfo->vertexLayout; - } - } - - m_pUpdateDisplacementPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanUpdateDisplacementPS.cso", wiResourceManager::PIXELSHADER)); - m_pGenGradientFoldingPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanGradientFoldingPS.cso", wiResourceManager::PIXELSHADER)); - - - - //// Compute shaders - //ID3DBlob* pBlobUpdateSpectrumCS = NULL; - - //CompileShaderFromFile(L"ocean_simulator_cs.hlsl", "UpdateSpectrumCS", "cs_4_0", &pBlobUpdateSpectrumCS); - //assert(pBlobUpdateSpectrumCS); - - //m_device->CreateComputeShader(pBlobUpdateSpectrumCS->GetBufferPointer(), pBlobUpdateSpectrumCS->GetBufferSize(), NULL, &m_pUpdateSpectrumCS); - //assert(m_pUpdateSpectrumCS); - - //SAFE_DELETE(pBlobUpdateSpectrumCS); - - //// Vertex & pixel shaders - //ID3DBlob* pBlobQuadVS = NULL; - //ID3DBlob* pBlobUpdateDisplacementPS = NULL; - //ID3DBlob* pBlobGenGradientFoldingPS = NULL; - - //CompileShaderFromFile(L"ocean_simulator_vs_ps.hlsl", "QuadVS", "vs_4_0", &pBlobQuadVS); - //CompileShaderFromFile(L"ocean_simulator_vs_ps.hlsl", "UpdateDisplacementPS", "ps_4_0", &pBlobUpdateDisplacementPS); - //CompileShaderFromFile(L"ocean_simulator_vs_ps.hlsl", "GenGradientFoldingPS", "ps_4_0", &pBlobGenGradientFoldingPS); - //assert(pBlobQuadVS); - //assert(pBlobUpdateDisplacementPS); - //assert(pBlobGenGradientFoldingPS); - - //m_device->CreateVertexShader(pBlobQuadVS->GetBufferPointer(), pBlobQuadVS->GetBufferSize(), NULL, &m_pQuadVS); - //m_device->CreatePixelShader(pBlobUpdateDisplacementPS->GetBufferPointer(), pBlobUpdateDisplacementPS->GetBufferSize(), NULL, &m_pUpdateDisplacementPS); - //m_device->CreatePixelShader(pBlobGenGradientFoldingPS->GetBufferPointer(), pBlobGenGradientFoldingPS->GetBufferSize(), NULL, &m_pGenGradientFoldingPS); - //assert(m_pQuadVS); - //assert(m_pUpdateDisplacementPS); - //assert(m_pGenGradientFoldingPS); - //SAFE_DELETE(pBlobUpdateDisplacementPS); - //SAFE_DELETE(pBlobGenGradientFoldingPS); - - //// Input layout - //INPUT_ELEMENT_DESC quad_layout_desc[] = - //{ - // { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, INPUT_PER_VERTEX_DATA, 0 }, - //}; - //m_device->CreateInputLayout(quad_layout_desc, 1, pBlobQuadVS->GetBufferPointer(), pBlobQuadVS->GetBufferSize(), &m_pQuadLayout); - //assert(m_pQuadLayout); - - //SAFE_DELETE(pBlobQuadVS); - // Quad vertex buffer GPUBufferDesc vb_desc; vb_desc.ByteWidth = 4 * sizeof(XMFLOAT4); @@ -324,23 +270,7 @@ wiOcean::wiOcean(const wiOceanParameter& params) // FFT fft512x512_create_plan(&m_fft_plan, 3); -#ifdef CS_DEBUG_BUFFER - GPUBufferDesc buf_desc; - buf_desc.ByteWidth = 3 * input_half_size * float2_stride; - buf_desc.Usage = USAGE_STAGING; - buf_desc.BindFlags = 0; - buf_desc.CPUAccessFlags = CPU_ACCESS_READ; - buf_desc.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED; - buf_desc.StructureByteStride = float2_stride; - - m_pDebugBuffer = new GPUBuffer; - wiRenderer::GetDevice()->CreateBuffer(&buf_desc, NULL, m_pDebugBuffer); -#endif - initRenderResource(); - createSurfaceMesh(); - createFresnelMap(); - loadTextures(); } wiOcean::~wiOcean() @@ -357,19 +287,10 @@ wiOcean::~wiOcean() SAFE_DELETE(m_pDisplacementMap); SAFE_DELETE(m_pGradientMap); - SAFE_DELETE(m_pUpdateSpectrumCS); - SAFE_DELETE(m_pQuadVS); - SAFE_DELETE(m_pUpdateDisplacementPS); - SAFE_DELETE(m_pGenGradientFoldingPS); - - SAFE_DELETE(m_pQuadLayout); SAFE_DELETE(m_pImmutableCB); SAFE_DELETE(m_pPerFrameCB); -#ifdef CS_DEBUG_BUFFER - SAFE_DELETE(m_pDebugBuffer); -#endif cleanupRenderResource(); } @@ -428,7 +349,7 @@ void wiOcean::initHeightMap(XMFLOAT2* out_h0, float* out_omega) } } -void wiOcean::updateDisplacementMap(float time) +void wiOcean::UpdateDisplacementMap(float time, GRAPHICSTHREAD threadID) { GraphicsDevice* device = wiRenderer::GetDevice(); @@ -474,7 +395,7 @@ void wiOcean::updateDisplacementMap(float time) // ------------------------------------ Perform FFT ------------------------------------------- - fft_512x512_c2c(&m_fft_plan, m_pBuffer_Float_Dxyz, m_pBuffer_Float_Dxyz, m_pBuffer_Float2_Ht); + fft_512x512_c2c(&m_fft_plan, m_pBuffer_Float_Dxyz, m_pBuffer_Float_Dxyz, m_pBuffer_Float2_Ht, threadID); // --------------------------------- Wrap Dx, Dy and Dz --------------------------------------- // Push RT @@ -552,26 +473,6 @@ void wiOcean::updateDisplacementMap(float time) device->GenerateMips(m_pGradientMap, threadID); - // Define CS_DEBUG_BUFFER to enable writing a buffer into a file. -#ifdef CS_DEBUG_BUFFER - { - m_pd3dImmediateContext->CopyResource(m_pDebugBuffer, m_pBuffer_Float_Dxyz); - MAPPED_SUBRESOURCE mapped_res; - m_pd3dImmediateContext->Map(m_pDebugBuffer, 0, MAP_READ, 0, &mapped_res); - - // set a break point below, and drag MappedResource.pData into in your Watch window - // and cast it as (float*) - - // Write to disk - XMFLOAT2* v = (XMFLOAT2*)mapped_res.pData; - - FILE* fp = fopen(".\\tmp\\Ht_raw.dat", "wb"); - fwrite(v, 512 * 512 * sizeof(float) * 2 * 3, 1, fp); - fclose(fp); - - m_pd3dImmediateContext->Unmap(m_pDebugBuffer, 0); - } -#endif device->EventEnd(threadID); } @@ -614,22 +515,6 @@ void wiOcean::initRenderResource() createFresnelMap(); loadTextures(); - { - VertexLayoutDesc layout[] = - { - { "POSITION", 0, FORMAT_R32G32_FLOAT, 0, 0, INPUT_PER_VERTEX_DATA, 0 }, - }; - UINT numElements = ARRAYSIZE(layout); - VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSurfaceVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); - if (vsinfo != nullptr) { - g_pOceanSurfVS = vsinfo->vertexShader; - g_pMeshLayout = vsinfo->vertexLayout; - } - } - - g_pOceanSurfPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSurfacePS.cso", wiResourceManager::PIXELSHADER)); - g_pWireframePS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSurfaceSimplePS.cso", wiResourceManager::PIXELSHADER)); - // Constants GPUBufferDesc cb_desc; @@ -725,11 +610,6 @@ void wiOcean::cleanupRenderResource() { SAFE_DELETE(g_pMeshIB); SAFE_DELETE(g_pMeshVB); - SAFE_DELETE(g_pMeshLayout); - - SAFE_DELETE(g_pOceanSurfVS); - SAFE_DELETE(g_pOceanSurfPS); - SAFE_DELETE(g_pWireframePS); SAFE_DELETE(g_pFresnelMap); SAFE_DELETE(g_pPerlinMap); @@ -1108,7 +988,7 @@ void wiOcean::createFresnelMap() void wiOcean::loadTextures() { - wiRenderer::GetDevice()->CreateTextureFromFile("perlin.dds", &g_pPerlinMap, true, GRAPHICSTHREAD_IMMEDIATE); + wiRenderer::GetDevice()->CreateTextureFromFile("perlin_noise.dds", &g_pPerlinMap, true, GRAPHICSTHREAD_IMMEDIATE); } bool wiOcean::checkNodeVisibility(const QuadNode& quad_node, const Camera& camera) @@ -1403,7 +1283,7 @@ int wiOcean::buildNodeList(QuadNode& quad_node, const Camera& camera) return position; } -void wiOcean::Render(const Camera* camera, float time) +void wiOcean::Render(const Camera* camera, float time, GRAPHICSTHREAD threadID) { GraphicsDevice* device = wiRenderer::GetDevice(); bool wire = wiRenderer::IsWireRender(); @@ -1521,3 +1401,65 @@ void wiOcean::Render(const Camera* camera, float time) //pd3dContext->PSSetShaderResources(1, 4, &ps_srvs[0]); } + +void wiOcean::LoadShaders() +{ + + m_pUpdateSpectrumCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSimulatorCS.cso", wiResourceManager::COMPUTESHADER)); + + { + VertexLayoutDesc layout[] = + { + { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, 0, INPUT_PER_VERTEX_DATA, 0 }, + }; + UINT numElements = ARRAYSIZE(layout); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanQuadVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + if (vsinfo != nullptr) { + m_pQuadVS = vsinfo->vertexShader; + m_pQuadLayout = vsinfo->vertexLayout; + } + } + + m_pUpdateDisplacementPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanUpdateDisplacementPS.cso", wiResourceManager::PIXELSHADER)); + m_pGenGradientFoldingPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanGradientFoldingPS.cso", wiResourceManager::PIXELSHADER)); + + + { + VertexLayoutDesc layout[] = + { + { "POSITION", 0, FORMAT_R32G32_FLOAT, 0, 0, INPUT_PER_VERTEX_DATA, 0 }, + }; + UINT numElements = ARRAYSIZE(layout); + VertexShaderInfo* vsinfo = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSurfaceVS.cso", wiResourceManager::VERTEXSHADER, layout, numElements)); + if (vsinfo != nullptr) { + g_pOceanSurfVS = vsinfo->vertexShader; + g_pMeshLayout = vsinfo->vertexLayout; + } + } + + g_pOceanSurfPS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSurfacePS.cso", wiResourceManager::PIXELSHADER)); + g_pWireframePS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "oceanSurfaceSimplePS.cso", wiResourceManager::PIXELSHADER)); + +} + +void wiOcean::SetUpStatic() +{ + LoadShaders(); + CSFFT_512x512_Data_t::LoadShaders(); +} + +void wiOcean::CleanUpStatic() +{ + SAFE_DELETE(m_pUpdateSpectrumCS); + SAFE_DELETE(m_pQuadVS); + SAFE_DELETE(m_pUpdateDisplacementPS); + SAFE_DELETE(m_pGenGradientFoldingPS); + + SAFE_DELETE(m_pQuadLayout); + + SAFE_DELETE(g_pMeshLayout); + + SAFE_DELETE(g_pOceanSurfVS); + SAFE_DELETE(g_pOceanSurfPS); + SAFE_DELETE(g_pWireframePS); +} diff --git a/WickedEngine/wiOcean.h b/WickedEngine/wiOcean.h index e90c0177a..ec909b58f 100644 --- a/WickedEngine/wiOcean.h +++ b/WickedEngine/wiOcean.h @@ -1,17 +1,3 @@ -// Copyright (c) 2011 NVIDIA Corporation. All rights reserved. -// -// TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED -// *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS -// OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT,IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA -// OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT, OR -// CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS -// OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY -// OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, -// EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. -// -// Please direct any bugs or questions to SDKFeedback@nvidia.com - #ifndef _OCEAN_SIMULATOR_H #define _OCEAN_SIMULATOR_H @@ -21,7 +7,6 @@ #include -//#define CS_DEBUG_BUFFER struct Camera; @@ -69,7 +54,8 @@ public: // -------------------------- Initialization & simulation routines ------------------------ // Update ocean wave when tick arrives. - void updateDisplacementMap(float time); + void UpdateDisplacementMap(float time, GRAPHICSTHREAD threadID); + void Render(const Camera* camera, float time, GRAPHICSTHREAD threadID); // Texture access wiGraphicsTypes::Texture2D* getDisplacementMap(); @@ -77,8 +63,9 @@ public: const wiOceanParameter& getParameters(); - void Render(const Camera* camera, float time); - + static void LoadShaders(); + static void SetUpStatic(); + static void CleanUpStatic(); protected: wiOceanParameter m_param; @@ -109,13 +96,12 @@ protected: wiGraphicsTypes::GPUBuffer* m_pQuadVB; // Shaders, layouts and constants - wiGraphicsTypes::ComputeShader* m_pUpdateSpectrumCS; + static wiGraphicsTypes::ComputeShader* m_pUpdateSpectrumCS; + static wiGraphicsTypes::VertexShader* m_pQuadVS; + static wiGraphicsTypes::PixelShader* m_pUpdateDisplacementPS; + static wiGraphicsTypes::PixelShader* m_pGenGradientFoldingPS; - wiGraphicsTypes::VertexShader* m_pQuadVS; - wiGraphicsTypes::PixelShader* m_pUpdateDisplacementPS; - wiGraphicsTypes::PixelShader* m_pGenGradientFoldingPS; - - wiGraphicsTypes::VertexLayout* m_pQuadLayout; + static wiGraphicsTypes::VertexLayout* m_pQuadLayout; wiGraphicsTypes::GPUBuffer* m_pImmutableCB; wiGraphicsTypes::GPUBuffer* m_pPerFrameCB; @@ -125,10 +111,6 @@ protected: // FFT wrap-up CSFFT512x512_Plan m_fft_plan; -#ifdef CS_DEBUG_BUFFER - wiGraphicsTypes::GPUBuffer* m_pDebugBuffer; -#endif - // Rendering params: @@ -211,7 +193,7 @@ protected: // D3D11 buffers and layout wiGraphicsTypes::GPUBuffer* g_pMeshVB = nullptr; wiGraphicsTypes::GPUBuffer* g_pMeshIB = nullptr; - wiGraphicsTypes::VertexLayout* g_pMeshLayout = nullptr; + static wiGraphicsTypes::VertexLayout* g_pMeshLayout; // Color look up 1D texture wiGraphicsTypes::Texture1D* g_pFresnelMap = nullptr; @@ -220,9 +202,9 @@ protected: wiGraphicsTypes::Texture2D* g_pPerlinMap = nullptr; // HLSL shaders - wiGraphicsTypes::VertexShader* g_pOceanSurfVS = nullptr; - wiGraphicsTypes::PixelShader* g_pOceanSurfPS = nullptr; - wiGraphicsTypes::PixelShader* g_pWireframePS = nullptr; + static wiGraphicsTypes::VertexShader* g_pOceanSurfVS; + static wiGraphicsTypes::PixelShader* g_pOceanSurfPS; + static wiGraphicsTypes::PixelShader* g_pWireframePS; wiGraphicsTypes::GPUBuffer* g_pPerCallCB = nullptr; wiGraphicsTypes::GPUBuffer* g_pPerFrameCB = nullptr; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index c83360bad..8eee7be75 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -2130,7 +2130,7 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) // Compute water simulation: if (ocean != nullptr) { - ocean->updateDisplacementMap(renderTime); + ocean->UpdateDisplacementMap(renderTime, threadID); } // Render out of date environment probes: @@ -4642,7 +4642,7 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Tex if (ocean != nullptr) { - ocean->Render(camera, renderTime); + ocean->Render(camera, renderTime, threadID); } if (grass)