Compare commits

..

No commits in common. "402df689759f95dea340c59fbeb596cad273ea2d" and "5e86a91499d0a712d5591b6e6546e6c3447d9e09" have entirely different histories.

2 changed files with 120 additions and 131 deletions

View File

@ -28,9 +28,6 @@ public class BloodComputeShader : MonoBehaviour
public int activeParticles = 0; public int activeParticles = 0;
public long score = 0; public long score = 0;
public int mop1Clean = 0;
public int mop2Clean = 0;
public float squeakVolume = 0.0f; public float squeakVolume = 0.0f;
public AudioSource squeakPlayer; public AudioSource squeakPlayer;
@ -107,8 +104,8 @@ public class BloodComputeShader : MonoBehaviour
argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments); argsBuffer = new ComputeBuffer(1, 5 * sizeof(uint), ComputeBufferType.IndirectArguments);
argsBuffer.SetData(args); argsBuffer.SetData(args);
ComputeHelper.CreateStructuredBuffer<uint>(ref numParticlesConsumedBuffer, 3); ComputeHelper.CreateStructuredBuffer<uint>(ref numParticlesConsumedBuffer, 2);
numParticlesConsumedBuffer.SetData(new uint[] { 0, 0, 0 }); numParticlesConsumedBuffer.SetData(new uint[] { 0, 0 });
bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer); bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer);
// Initialize with empty data // Initialize with empty data
@ -148,55 +145,47 @@ public class BloodComputeShader : MonoBehaviour
} }
bool putBuffer = false; bool putBuffer = false;
uint[] bufferData = {0,0,0}; uint[] bufferData = new uint[] {0,0};
if (readbackRequest.done) if (readbackRequest.done)
{ {
bufferData = readbackRequest.GetData<uint>().ToArray(); bufferData[0] = readbackRequest.GetData<uint>()[0];
bufferData[1] = readbackRequest.GetData<uint>()[1];
// Blood cleaned // Blood cleaned
if (bufferData[0] > 0 || bufferData[1] > 0) if (bufferData[0] > 0)
{ {
// Debug.Log("Cleaned " + bufferData[0]); // Debug.Log("Cleaned " + bufferData[0]);
uint totalBloodCleaned = bufferData[0] + bufferData[1]; activeParticles -= (int)bufferData[0];
activeParticles -= (int)totalBloodCleaned;
score += bufferData[0]; score += bufferData[0];
// this doesnt exist but ok float mappedRumble = Convert.ToSingle(bufferData[0]).Remap(0, RumbleAmount, 0, 0.1f);
// float mappedRumble = Convert.ToSingle(bufferData[0]).Remap(0, RumbleAmount, 0, 0.1f);
//RumbleManager.StartRumble(-1, 0, mappedRumble, 0.1f); //RumbleManager.StartRumble(-1, 0, mappedRumble, 0.1f);
squeakVolume += 0.1f; squeakVolume += 0.1f;
mop1Clean += (int)bufferData[0];
mop2Clean += (int)bufferData[1];
// Reset counter // Reset counter
putBuffer = true; putBuffer = true;
bufferData[0] = 0; bufferData[0] = 0;
bufferData[1] = 0;
} }
// Blood hitting the floor // Blood hitting the floor
if (bufferData[1] > 0) if (bufferData[1] > 0) {
{ splatterVolume += bufferData[1]/25.0f;
splatterVolume += bufferData[1] / 25.0f;
// Debug.Log("splat x" + bufferData[1]); // Debug.Log("splat x" + bufferData[1]);
putBuffer = true; putBuffer = true;
bufferData[2] = 0; bufferData[1] = 0;
} }
RequestAsyncReadback(); RequestAsyncReadback();
} }
if (putBuffer) if (putBuffer) {
{
numParticlesConsumedBuffer.SetData(bufferData); numParticlesConsumedBuffer.SetData(bufferData);
bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer); bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer);
@ -217,9 +206,6 @@ public class BloodComputeShader : MonoBehaviour
if (squeakVolume < 0.001) if (squeakVolume < 0.001)
squeakVolume = 0; squeakVolume = 0;
mop1Clean = (int)(mop1Clean * 0.8f);
mop2Clean = (int)(mop2Clean * 0.8f);
} }
void FixedUpdate() void FixedUpdate()
@ -280,13 +266,13 @@ public class BloodComputeShader : MonoBehaviour
// Test for race conditions // Test for race conditions
// yield return new WaitForSeconds(1.0f); // yield return new WaitForSeconds(1.0f);
bloodCompute.SetFloat("particleVel", power / 4.0f); bloodCompute.SetFloat("particleVel", power/4.0f);
bloodCompute.SetVector("particleInitPos", loc); bloodCompute.SetVector("particleInitPos", loc);
bloodCompute.SetInt("particlesToInitialize", found); bloodCompute.SetInt("particlesToInitialize", found);
Vector3 pow = UnityEngine.Random.insideUnitSphere * power; Vector3 pow = UnityEngine.Random.insideUnitSphere * power;
pow.z = Mathf.Abs(pow.z); pow.z = Mathf.Abs(pow.z);
bloodCompute.SetVector("initialVelocity", pow); bloodCompute.SetVector("initialVelocity",pow);
ComputeHelper.Dispatch(bloodCompute, amount, 1, 1, InitDustKernel); ComputeHelper.Dispatch(bloodCompute, amount, 1, 1, InitDustKernel);

View File

@ -28,7 +28,8 @@ float gravity;
float particleVel; float particleVel;
// Hash function www.cs.ubc.ca/~rbridson/docs/schechter-sca08-turbulence.pdf // Hash function www.cs.ubc.ca/~rbridson/docs/schechter-sca08-turbulence.pdf
uint hash(uint state) { uint hash(uint state)
{
state ^= 2747636419u; state ^= 2747636419u;
state *= 2654435769u; state *= 2654435769u;
state ^= state >> 16; state ^= state >> 16;
@ -38,18 +39,22 @@ uint hash(uint state) {
return state; return state;
} }
float scaleToRange01(uint state) { return state / 4294967295.0; } float scaleToRange01(uint state)
{
return state / 4294967295.0;
}
[numthreads(64, 1, 1)] void InitDust(uint3 id
: SV_DispatchThreadID) { [numthreads(64,1,1)]
void InitDust (uint3 id : SV_DispatchThreadID)
{
if (id.x > particlesToInitialize) { if (id.x > particlesToInitialize) {
return; return;
} }
uint i = freeParticles[id.x]; uint i = freeParticles[id.x];
// if (particles[id.x].enabled != 0 || numParticlesInitialized[0] >= // if (particles[id.x].enabled != 0 || numParticlesInitialized[0] >= numParticles ) {
// numParticles ) {
while (i <= numParticles) { while (i <= numParticles) {
if (i == numParticles) { if (i == numParticles) {
return; return;
@ -65,7 +70,7 @@ float scaleToRange01(uint state) { return state / 4294967295.0; }
uint randState = i; uint randState = i;
randState = hash(randState); randState = hash(randState);
float dv = scaleToRange01(randState) * 3.14f * 2.0f; float dv = scaleToRange01(randState) * 3.14f*2.0f;
float dx = cos(dv); float dx = cos(dv);
float dy = sin(dv); float dy = sin(dv);
randState = hash(randState); randState = hash(randState);
@ -91,8 +96,9 @@ float scaleToRange01(uint state) { return state / 4294967295.0; }
// InterlockedAdd(numParticlesInitialized[0],1); // InterlockedAdd(numParticlesInitialized[0],1);
} }
[numthreads(64, 1, 1)] void UpdateDust(uint3 id [numthreads(64,1,1)]
: SV_DispatchThreadID) { void UpdateDust (uint3 id : SV_DispatchThreadID)
{
uint i = id.x; uint i = id.x;
if (particles[i].enabled == 0) { if (particles[i].enabled == 0) {
@ -110,7 +116,7 @@ float scaleToRange01(uint state) { return state / 4294967295.0; }
particles[i].airborne = 0; particles[i].airborne = 0;
// Increase splattered particles // Increase splattered particles
InterlockedAdd(numParticlesConsumed[2], 1); InterlockedAdd(numParticlesConsumed[1],1);
} }
float3 offset1 = mop1Pos - pos; float3 offset1 = mop1Pos - pos;
@ -126,14 +132,11 @@ float scaleToRange01(uint state) { return state / 4294967295.0; }
if (dist < CleanRadius) { if (dist < CleanRadius) {
particles[i].enabled = 0; particles[i].enabled = 0;
// Increase cleaned particles // Increase cleaned particles
if (dist1 < dist2) { // Mop1 is the one that cleaned InterlockedAdd(numParticlesConsumed[0],1);
InterlockedAdd(numParticlesConsumed[0], 1);
} else {
InterlockedAdd(numParticlesConsumed[1], 1);
}
} }
} }
particles[i].position += particles[i].velocity * deltaTime; particles[i].position += particles[i].velocity * deltaTime;
positions[i] = float4(particles[i].position, particles[i].enabled * size); positions[i] = float4(particles[i].position, particles[i].enabled * size);
} }