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()