diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 26309d39d..e5ee363ba 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -824,6 +824,8 @@ void EditorComponent::Load() decalWnd->SetDecal(nullptr); envProbeWnd->SetProbe(nullptr); materialWnd->SetMaterial(nullptr); + emitterWnd->SetObject(nullptr); + forceFieldWnd->SetForceField(nullptr); }); GetGUI().AddWidget(clearButton); diff --git a/Editor/EmitterWindow.cpp b/Editor/EmitterWindow.cpp index cdc2cd1eb..209b07d52 100644 --- a/Editor/EmitterWindow.cpp +++ b/Editor/EmitterWindow.cpp @@ -235,6 +235,7 @@ void EmitterWindow::SetObject(Object* obj) { GetEmitter()->DEBUG = false; } + debugCheckBox->SetCheck(false); object = obj; @@ -310,8 +311,7 @@ void EmitterWindow::UpdateData() auto data = emitter->GetDebugData(); stringstream ss(""); - ss << "Alive Particle Count [CURRENT] = " << data.aliveCount_CURRENT << endl; - ss << "Alive Particle Count [NEW] = " << data.aliveCount_NEW << endl; + ss << "Alive Particle Count = " << data.aliveCount << endl; ss << "Dead Particle Count = " << data.deadCount << endl; ss << "GPU Emit count = " << data.realEmitCount << endl; debugDataLabel->SetText(ss.str()); diff --git a/WickedEngine/ShaderInterop_EmittedParticle.h b/WickedEngine/ShaderInterop_EmittedParticle.h index bacb69ab9..16a839eba 100644 --- a/WickedEngine/ShaderInterop_EmittedParticle.h +++ b/WickedEngine/ShaderInterop_EmittedParticle.h @@ -19,9 +19,8 @@ struct Particle struct ParticleCounters { - uint aliveCount_CURRENT; + uint aliveCount; uint deadCount; - uint aliveCount_NEW; uint realEmitCount; }; diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj b/WickedEngine/WickedEngine_SHADERS.vcxproj index e6c1eaf5b..2f683aec3 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj @@ -121,10 +121,6 @@ Pixel - - Compute - 5.0 - Compute 5.0 @@ -133,10 +129,6 @@ Compute 5.0 - - Compute - 5.0 - Compute 5.0 diff --git a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters index 05df703ca..148424979 100644 --- a/WickedEngine/WickedEngine_SHADERS.vcxproj.filters +++ b/WickedEngine/WickedEngine_SHADERS.vcxproj.filters @@ -612,15 +612,9 @@ CS - - CS - CS - - CS - CS diff --git a/WickedEngine/emittedparticle_drawargsCS.hlsl b/WickedEngine/emittedparticle_drawargsCS.hlsl deleted file mode 100644 index 868e5a6b0..000000000 --- a/WickedEngine/emittedparticle_drawargsCS.hlsl +++ /dev/null @@ -1,16 +0,0 @@ -#include "globals.hlsli" -#include "ShaderInterop_EmittedParticle.h" - -RWSTRUCTUREDBUFFER(counterBuffer, ParticleCounters, 4); -RWRAWBUFFER(indirectDrawBuffer, 5); // indirectdrawinstanced args - -[numthreads(1, 1, 1)] -void main(uint3 DTid : SV_DispatchThreadID) -{ - // Fill Draw arguments for drawing: - // VertexCountPerInstance; - // InstanceCount; - // StartVertexLocation; - // StartInstanceLocation; - indirectDrawBuffer.Store4(24, uint4(counterBuffer[0].aliveCount_NEW * 6, 1, 0, 0)); -} \ No newline at end of file diff --git a/WickedEngine/emittedparticle_emitCS.hlsl b/WickedEngine/emittedparticle_emitCS.hlsl index 002509ee6..f8f03ff4c 100644 --- a/WickedEngine/emittedparticle_emitCS.hlsl +++ b/WickedEngine/emittedparticle_emitCS.hlsl @@ -2,7 +2,7 @@ #include "ShaderInterop_EmittedParticle.h" RWSTRUCTUREDBUFFER(particleBuffer, Particle, 0); -RWSTRUCTUREDBUFFER(aliveBuffer_OLD, uint, 1); +RWSTRUCTUREDBUFFER(aliveBuffer_CURRENT, uint, 1); RWSTRUCTUREDBUFFER(aliveBuffer_NEW, uint, 2); RWSTRUCTUREDBUFFER(deadBuffer, uint, 3); RWSTRUCTUREDBUFFER(counterBuffer, ParticleCounters, 4); @@ -99,8 +99,8 @@ void main(uint3 DTid : SV_DispatchThreadID) particleBuffer[newParticleIndex] = particle; // and add index to the alive list (push): - uint aliveCount_OLD; - InterlockedAdd(counterBuffer[0].aliveCount_CURRENT, 1, aliveCount_OLD); - aliveBuffer_OLD[aliveCount_OLD] = newParticleIndex; + uint aliveCount; + InterlockedAdd(counterBuffer[0].aliveCount, 1, aliveCount); + aliveBuffer_CURRENT[aliveCount] = newParticleIndex; } } diff --git a/WickedEngine/emittedparticle_kickoffUpdateCS.hlsl b/WickedEngine/emittedparticle_kickoffUpdateCS.hlsl index 2e92229ea..dd0746233 100644 --- a/WickedEngine/emittedparticle_kickoffUpdateCS.hlsl +++ b/WickedEngine/emittedparticle_kickoffUpdateCS.hlsl @@ -2,24 +2,31 @@ #include "ShaderInterop_EmittedParticle.h" RWSTRUCTUREDBUFFER(counterBuffer, ParticleCounters, 4); -RWRAWBUFFER(indirectDispatchBuffer, 5); // indirect kickoff args +RWRAWBUFFER(indirectBuffers, 5); [numthreads(1, 1, 1)] void main(uint3 DTid : SV_DispatchThreadID) { + // Load dead particle count: uint deadCount = counterBuffer[0].deadCount; + // Load alive particle count from draw argument buffer (which contains alive particle count * 6): + uint aliveCount_NEW = indirectBuffers.Load(24) / 6; + // we can not emit more than there are free slots in the dead list: uint realEmitCount = min(deadCount, xEmitCount); - // Fill dispatch argument buffer for simulation: - indirectDispatchBuffer.Store3(0, uint3(ceil((float)realEmitCount / (float)THREADCOUNT_EMIT), 1, 1)); + // Fill dispatch argument buffer for emitting (ThreadGroupCountX, ThreadGroupCountY, ThreadGroupCountZ): + indirectBuffers.Store3(0, uint3(ceil((float)realEmitCount / (float)THREADCOUNT_EMIT), 1, 1)); + + // Fill dispatch argument buffer for simulation (ThreadGroupCountX, ThreadGroupCountY, ThreadGroupCountZ): + indirectBuffers.Store3(12, uint3(ceil((float)(aliveCount_NEW + realEmitCount) / (float)THREADCOUNT_SIMULATION), 1, 1)); + + // Reset the draw argument buffer to defaults (VertexCountPerInstance, InstanceCount, StartVertexLocation, StartInstanceLocation): + indirectBuffers.Store4(24, uint4(0, 1, 0, 0)); // copy new alivelistcount to current alivelistcount: - counterBuffer[0].aliveCount_CURRENT = counterBuffer[0].aliveCount_NEW; - - // also reset the new alive list count: - counterBuffer[0].aliveCount_NEW = 0; + counterBuffer[0].aliveCount = aliveCount_NEW; // and write real emit count: counterBuffer[0].realEmitCount = realEmitCount; diff --git a/WickedEngine/emittedparticle_simulateCS.hlsl b/WickedEngine/emittedparticle_simulateCS.hlsl index 4f82c0cde..1e4021f6e 100644 --- a/WickedEngine/emittedparticle_simulateCS.hlsl +++ b/WickedEngine/emittedparticle_simulateCS.hlsl @@ -2,10 +2,11 @@ #include "ShaderInterop_EmittedParticle.h" RWSTRUCTUREDBUFFER(particleBuffer, Particle, 0); -RWSTRUCTUREDBUFFER(aliveBuffer_OLD, uint, 1); +RWSTRUCTUREDBUFFER(aliveBuffer_CURRENT, uint, 1); RWSTRUCTUREDBUFFER(aliveBuffer_NEW, uint, 2); RWSTRUCTUREDBUFFER(deadBuffer, uint, 3); RWSTRUCTUREDBUFFER(counterBuffer, ParticleCounters, 4); +RWRAWBUFFER(indirectBuffers, 5); #define NUM_LDS_FORCEFIELDS 32 struct LDS_ForceField @@ -26,7 +27,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) // Read alive particle count and store in LDS: if (Gid == 0) { - aliveParticleCount = counterBuffer[0].aliveCount_CURRENT; + aliveParticleCount = counterBuffer[0].aliveCount; } // Load the forcefields into LDS: @@ -49,7 +50,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) { const float dt = g_xFrame_DeltaTime; - uint particleIndex = aliveBuffer_OLD[DTid.x]; + uint particleIndex = aliveBuffer_CURRENT[DTid.x]; Particle particle = particleBuffer[particleIndex]; if (particle.life > 0) @@ -91,8 +92,8 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) // add to new alive list: uint newAliveIndex; - InterlockedAdd(counterBuffer[0].aliveCount_NEW, 1, newAliveIndex); - aliveBuffer_NEW[newAliveIndex] = particleIndex; + indirectBuffers.InterlockedAdd(24, 6, newAliveIndex); // write the draw argument buffer, which should contain particle count * 6 + aliveBuffer_NEW[newAliveIndex / 6] = particleIndex; // draw arg buffer contains particle count * 6, so just divide to retrieve correct index } else { diff --git a/WickedEngine/emittedparticle_simulateargsCS.hlsl b/WickedEngine/emittedparticle_simulateargsCS.hlsl deleted file mode 100644 index d2e2754d3..000000000 --- a/WickedEngine/emittedparticle_simulateargsCS.hlsl +++ /dev/null @@ -1,12 +0,0 @@ -#include "globals.hlsli" -#include "ShaderInterop_EmittedParticle.h" - -RWSTRUCTUREDBUFFER(counterBuffer, ParticleCounters, 4); -RWRAWBUFFER(indirectDispatchBuffer, 5); // indirect simulation args - -[numthreads(1, 1, 1)] -void main( uint3 DTid : SV_DispatchThreadID ) -{ - // Fill dispatch argument buffer for simulation: - indirectDispatchBuffer.Store3(12, uint3(ceil((float)counterBuffer[0].aliveCount_CURRENT / (float)THREADCOUNT_SIMULATION), 1, 1)); -} \ No newline at end of file diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index c34752c81..ab0b4e3db 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -14,7 +14,7 @@ using namespace wiGraphicsTypes; VertexShader *wiEmittedParticle::vertexShader = nullptr; PixelShader *wiEmittedParticle::pixelShader = nullptr, *wiEmittedParticle::simplestPS = nullptr; -ComputeShader *wiEmittedParticle::kickoffUpdateCS, *wiEmittedParticle::emitCS = nullptr, *wiEmittedParticle::simulateargsCS = nullptr, *wiEmittedParticle::drawargsCS = nullptr, *wiEmittedParticle::simulateCS = nullptr; +ComputeShader *wiEmittedParticle::kickoffUpdateCS, *wiEmittedParticle::emitCS = nullptr, *wiEmittedParticle::simulateCS = nullptr; BlendState *wiEmittedParticle::blendStateAlpha = nullptr,*wiEmittedParticle::blendStateAdd = nullptr; RasterizerState *wiEmittedParticle::rasterizerState = nullptr,*wiEmittedParticle::wireFrameRS = nullptr; DepthStencilState *wiEmittedParticle::depthStencilState = nullptr; @@ -189,9 +189,8 @@ void wiEmittedParticle::CreateSelfBuffers() ParticleCounters counters; - counters.aliveCount_CURRENT = 0; + counters.aliveCount = 0; counters.deadCount = MAX_PARTICLES; - counters.aliveCount_NEW = 0; counters.realEmitCount = 0; data.pSysMem = &counters; @@ -308,18 +307,10 @@ void wiEmittedParticle::UpdateRenderData(GRAPHICSTHREAD threadID) device->BindCS(emitCS, threadID); device->DispatchIndirect(indirectBuffers, 0, threadID); - // kick off simulation based on CURRENT alivelist count - device->BindCS(simulateargsCS, threadID); - device->Dispatch(1, 1, 1, threadID); - // update CURRENT alive list, write NEW alive list device->BindCS(simulateCS, threadID); device->DispatchIndirect(indirectBuffers, sizeof(wiGraphicsTypes::IndirectDispatchArgs), threadID); - // update the draw arguments - device->BindCS(drawargsCS, threadID); - device->Dispatch(1, 1, 1, threadID); - device->BindCS(nullptr, threadID); device->UnBindUnorderedAccessResources(0, ARRAYSIZE(uavs), threadID); @@ -398,8 +389,6 @@ void wiEmittedParticle::LoadShaders() kickoffUpdateCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "emittedparticle_kickoffUpdateCS.cso", wiResourceManager::COMPUTESHADER)); emitCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "emittedparticle_emitCS.cso", wiResourceManager::COMPUTESHADER)); - simulateargsCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "emittedparticle_simulateargsCS.cso", wiResourceManager::COMPUTESHADER)); - drawargsCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "emittedparticle_drawargsCS.cso", wiResourceManager::COMPUTESHADER)); simulateCS = static_cast(wiResourceManager::GetShaderManager()->add(wiRenderer::SHADERPATH + "emittedparticle_simulateCS.cso", wiResourceManager::COMPUTESHADER)); @@ -508,10 +497,7 @@ void wiEmittedParticle::CleanUpStatic() SAFE_DELETE(pixelShader); SAFE_DELETE(simplestPS); SAFE_DELETE(emitCS); - SAFE_DELETE(simulateargsCS); - SAFE_DELETE(drawargsCS); SAFE_DELETE(simulateCS); - //SAFE_DELETE(constantBuffer); SAFE_DELETE(blendStateAlpha); SAFE_DELETE(blendStateAdd); SAFE_DELETE(rasterizerState); diff --git a/WickedEngine/wiEmittedParticle.h b/WickedEngine/wiEmittedParticle.h index 558712d9b..039d9c1b1 100644 --- a/WickedEngine/wiEmittedParticle.h +++ b/WickedEngine/wiEmittedParticle.h @@ -28,10 +28,10 @@ private: wiGraphicsTypes::GPUBuffer* constantBuffer; void CreateSelfBuffers(); - static wiGraphicsTypes::ComputeShader *kickoffUpdateCS, *emitCS, *simulateargsCS, *drawargsCS, *simulateCS; - static wiGraphicsTypes::VertexShader *vertexShader; - static wiGraphicsTypes::PixelShader *pixelShader,*simplestPS; - static wiGraphicsTypes::BlendState *blendStateAlpha,*blendStateAdd; + static wiGraphicsTypes::ComputeShader *kickoffUpdateCS, *emitCS, *simulateCS; + static wiGraphicsTypes::VertexShader *vertexShader; + static wiGraphicsTypes::PixelShader *pixelShader,*simplestPS; + static wiGraphicsTypes::BlendState *blendStateAlpha,*blendStateAdd; static wiGraphicsTypes::RasterizerState *rasterizerState,*wireFrameRS; static wiGraphicsTypes::DepthStencilState *depthStencilState; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 810de693f..15b007a18 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 13; // minor bug fixes, alterations, refactors, updates - const int revision = 71; + const int revision = 72; long GetVersion()