Bloodmanager now has seperate values for blood mopped for both players
This commit is contained in:
parent
54b6c3115c
commit
a70473e7e8
|
@ -15,7 +15,7 @@ public struct Droplet
|
||||||
|
|
||||||
public class BloodComputeShader : MonoBehaviour
|
public class BloodComputeShader : MonoBehaviour
|
||||||
{
|
{
|
||||||
public static BloodComputeShader Instance { get; private set; }
|
public static BloodComputeShader Instance { get; private set; }
|
||||||
public int numParticles = 1000;
|
public int numParticles = 1000;
|
||||||
|
|
||||||
public ComputeShader bloodCompute;
|
public ComputeShader bloodCompute;
|
||||||
|
@ -28,6 +28,9 @@ 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;
|
||||||
|
|
||||||
|
@ -104,8 +107,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, 2);
|
ComputeHelper.CreateStructuredBuffer<uint>(ref numParticlesConsumedBuffer, 3);
|
||||||
numParticlesConsumedBuffer.SetData(new uint[] { 0, 0 });
|
numParticlesConsumedBuffer.SetData(new uint[] { 0, 0, 0 });
|
||||||
bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer);
|
bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer);
|
||||||
|
|
||||||
// Initialize with empty data
|
// Initialize with empty data
|
||||||
|
@ -145,50 +148,58 @@ public class BloodComputeShader : MonoBehaviour
|
||||||
}
|
}
|
||||||
|
|
||||||
bool putBuffer = false;
|
bool putBuffer = false;
|
||||||
uint[] bufferData = new uint[] {0,0};
|
uint[] bufferData = {0,0,0};
|
||||||
|
|
||||||
if (readbackRequest.done)
|
if (readbackRequest.done)
|
||||||
{
|
{
|
||||||
bufferData[0] = readbackRequest.GetData<uint>()[0];
|
bufferData = readbackRequest.GetData<uint>().ToArray();
|
||||||
bufferData[1] = readbackRequest.GetData<uint>()[1];
|
|
||||||
|
|
||||||
// Blood cleaned
|
// Blood cleaned
|
||||||
if (bufferData[0] > 0)
|
if (bufferData[0] > 0 || bufferData[1] > 0)
|
||||||
{
|
{
|
||||||
// Debug.Log("Cleaned " + bufferData[0]);
|
// Debug.Log("Cleaned " + bufferData[0]);
|
||||||
|
|
||||||
activeParticles -= (int)bufferData[0];
|
uint totalBloodCleaned = bufferData[0] + bufferData[1];
|
||||||
|
|
||||||
|
activeParticles -= (int)totalBloodCleaned;
|
||||||
|
|
||||||
score += bufferData[0];
|
score += bufferData[0];
|
||||||
|
|
||||||
float mappedRumble = Convert.ToSingle(bufferData[0]).Remap(0, RumbleAmount, 0, 0.1f);
|
// this doesnt exist but ok
|
||||||
|
// 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[1] = 0;
|
bufferData[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestAsyncReadback();
|
RequestAsyncReadback();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (putBuffer) {
|
if (putBuffer)
|
||||||
|
{
|
||||||
numParticlesConsumedBuffer.SetData(bufferData);
|
numParticlesConsumedBuffer.SetData(bufferData);
|
||||||
bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer);
|
bloodCompute.SetBuffer(UpdateDustKernel, "numParticlesConsumed", numParticlesConsumedBuffer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ComputeHelper.Dispatch(bloodCompute, numParticles, 1, 1, UpdateDustKernel);
|
ComputeHelper.Dispatch(bloodCompute, numParticles, 1, 1, UpdateDustKernel);
|
||||||
|
@ -206,6 +217,9 @@ 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()
|
||||||
|
@ -266,13 +280,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);
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
#pragma kernel UpdateDust
|
#pragma kernel UpdateDust
|
||||||
|
|
||||||
struct Particle {
|
struct Particle {
|
||||||
float3 position;
|
float3 position;
|
||||||
float3 velocity;
|
float3 velocity;
|
||||||
uint enabled;
|
uint enabled;
|
||||||
uint airborne;
|
uint airborne;
|
||||||
};
|
};
|
||||||
|
|
||||||
RWStructuredBuffer<float4> positions;
|
RWStructuredBuffer<float4> positions;
|
||||||
|
@ -28,115 +28,112 @@ 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;
|
state *= 2654435769u;
|
||||||
state *= 2654435769u;
|
state ^= state >> 16;
|
||||||
state ^= state >> 16;
|
state *= 2654435769u;
|
||||||
state *= 2654435769u;
|
return state;
|
||||||
return state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float scaleToRange01(uint state)
|
float scaleToRange01(uint state) { return state / 4294967295.0; }
|
||||||
{
|
|
||||||
return state / 4294967295.0;
|
[numthreads(64, 1, 1)] void InitDust(uint3 id
|
||||||
|
: SV_DispatchThreadID) {
|
||||||
|
if (id.x > particlesToInitialize) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint i = freeParticles[id.x];
|
||||||
|
|
||||||
|
// if (particles[id.x].enabled != 0 || numParticlesInitialized[0] >=
|
||||||
|
// numParticles ) {
|
||||||
|
while (i <= numParticles) {
|
||||||
|
if (i == numParticles) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (particles[i].enabled == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint randState = i;
|
||||||
|
|
||||||
|
randState = hash(randState);
|
||||||
|
float dv = scaleToRange01(randState) * 3.14f * 2.0f;
|
||||||
|
float dx = cos(dv);
|
||||||
|
float dy = sin(dv);
|
||||||
|
randState = hash(randState);
|
||||||
|
float dz = scaleToRange01(randState);
|
||||||
|
|
||||||
|
float3 nvel = float3(dx, dy, dz) * particleVel;
|
||||||
|
|
||||||
|
randState = hash(randState);
|
||||||
|
nvel.xy *= scaleToRange01(randState);
|
||||||
|
|
||||||
|
randState = hash(randState);
|
||||||
|
float3 iv = initialVelocity * scaleToRange01(randState);
|
||||||
|
|
||||||
|
particles[i].velocity = iv + nvel;
|
||||||
|
|
||||||
|
particles[i].position = particleInitPos;
|
||||||
|
particles[i].position.z = 0.01;
|
||||||
|
particles[i].enabled = 1;
|
||||||
|
particles[i].airborne = 1;
|
||||||
|
positions[i] = float4(particles[i].position, 1 * size);
|
||||||
|
// particles[i].position = positions[i].xyz;
|
||||||
|
|
||||||
|
// InterlockedAdd(numParticlesInitialized[0],1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[numthreads(64, 1, 1)] void UpdateDust(uint3 id
|
||||||
[numthreads(64,1,1)]
|
: SV_DispatchThreadID) {
|
||||||
void InitDust (uint3 id : SV_DispatchThreadID)
|
uint i = id.x;
|
||||||
{
|
|
||||||
if (id.x > particlesToInitialize) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint i = freeParticles[id.x];
|
|
||||||
|
|
||||||
// if (particles[id.x].enabled != 0 || numParticlesInitialized[0] >= numParticles ) {
|
|
||||||
while (i <= numParticles) {
|
|
||||||
if (i == numParticles) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (particles[i].enabled == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint randState = i;
|
|
||||||
|
|
||||||
randState = hash(randState);
|
|
||||||
float dv = scaleToRange01(randState) * 3.14f*2.0f;
|
|
||||||
float dx = cos(dv);
|
|
||||||
float dy = sin(dv);
|
|
||||||
randState = hash(randState);
|
|
||||||
float dz = scaleToRange01(randState);
|
|
||||||
|
|
||||||
float3 nvel = float3(dx, dy, dz) * particleVel;
|
|
||||||
|
|
||||||
randState = hash(randState);
|
|
||||||
nvel.xy *= scaleToRange01(randState);
|
|
||||||
|
|
||||||
randState = hash(randState);
|
|
||||||
float3 iv = initialVelocity * scaleToRange01(randState);
|
|
||||||
|
|
||||||
particles[i].velocity = iv + nvel;
|
|
||||||
|
|
||||||
particles[i].position = particleInitPos;
|
|
||||||
particles[i].position.z = 0.01;
|
|
||||||
particles[i].enabled = 1;
|
|
||||||
particles[i].airborne = 1;
|
|
||||||
positions[i] = float4(particles[i].position, 1 * size);
|
|
||||||
// particles[i].position = positions[i].xyz;
|
|
||||||
|
|
||||||
// InterlockedAdd(numParticlesInitialized[0],1);
|
|
||||||
}
|
|
||||||
|
|
||||||
[numthreads(64,1,1)]
|
|
||||||
void UpdateDust (uint3 id : SV_DispatchThreadID)
|
|
||||||
{
|
|
||||||
uint i = id.x;
|
|
||||||
|
|
||||||
if (particles[i].enabled == 0) {
|
if (particles[i].enabled == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float3 pos = particles[i].position;
|
|
||||||
|
|
||||||
if (particles[i].position.z > 0) {
|
float3 pos = particles[i].position;
|
||||||
particles[i].velocity.z -= gravity * deltaTime;
|
|
||||||
} else {
|
|
||||||
particles[i].velocity -= particles[i].velocity * deltaTime * 15;
|
|
||||||
|
|
||||||
if (particles[i].airborne == 1) {
|
|
||||||
particles[i].airborne = 0;
|
|
||||||
|
|
||||||
// Increase splattered particles
|
if (particles[i].position.z > 0) {
|
||||||
InterlockedAdd(numParticlesConsumed[1],1);
|
particles[i].velocity.z -= gravity * deltaTime;
|
||||||
}
|
} else {
|
||||||
|
particles[i].velocity -= particles[i].velocity * deltaTime * 15;
|
||||||
|
|
||||||
float3 offset1 = mop1Pos - pos;
|
if (particles[i].airborne == 1) {
|
||||||
offset1.z = 0;
|
particles[i].airborne = 0;
|
||||||
float dist1 = dot(offset1, offset1);
|
|
||||||
|
|
||||||
float3 offset2 = mop2Pos - pos;
|
// Increase splattered particles
|
||||||
offset2.z = 0;
|
InterlockedAdd(numParticlesConsumed[2], 1);
|
||||||
float dist2 = dot(offset2, offset2);
|
}
|
||||||
|
|
||||||
float dist = min(dist1, dist2);
|
float3 offset1 = mop1Pos - pos;
|
||||||
|
offset1.z = 0;
|
||||||
if (dist < CleanRadius) {
|
float dist1 = dot(offset1, offset1);
|
||||||
particles[i].enabled = 0;
|
|
||||||
// Increase cleaned particles
|
|
||||||
InterlockedAdd(numParticlesConsumed[0],1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
particles[i].position += particles[i].velocity * deltaTime;
|
float3 offset2 = mop2Pos - pos;
|
||||||
positions[i] = float4(particles[i].position, particles[i].enabled * size);
|
offset2.z = 0;
|
||||||
|
float dist2 = dot(offset2, offset2);
|
||||||
|
|
||||||
|
float dist = min(dist1, dist2);
|
||||||
|
|
||||||
|
if (dist < CleanRadius) {
|
||||||
|
particles[i].enabled = 0;
|
||||||
|
// Increase cleaned particles
|
||||||
|
if (dist1 < dist2) { // Mop1 is the one that cleaned
|
||||||
|
InterlockedAdd(numParticlesConsumed[0], 1);
|
||||||
|
} else {
|
||||||
|
InterlockedAdd(numParticlesConsumed[1], 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
particles[i].position += particles[i].velocity * deltaTime;
|
||||||
|
positions[i] = float4(particles[i].position, particles[i].enabled * size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue