private void Update() { agentDataBuffer[] buffer = new agentDataBuffer[numBoidAgents]; predDataBuffer[] predBuffer = new predDataBuffer[numPredAgents]; for (int i = 0; i < numBoidAgents; i++) { buffer[i].position = boids[i].Position; buffer[i].forwardDir = boids[i].ForwardDir; } for (int j = 0; j < numPredAgents; j++) { predBuffer[j].position = predators[j].Position; } //Set compute shader properties and data: int size = 3 * 6 * sizeof(float) + 3 * sizeof(int); //size of data buffer int size2 = 3 * sizeof(float); ComputeBuffer computeBuffer = new ComputeBuffer(numBoidAgents, size); computeBuffer.SetData(buffer); ComputeBuffer computeBuffer2 = null; //SetPredators buffer: if (numPredAgents > 0) { computeBuffer2 = new ComputeBuffer(numPredAgents, size2); computeBuffer2.SetData(predBuffer); computeShader.SetBuffer(0, "predData", computeBuffer2); } computeShader.SetBuffer(0, "boidsData", computeBuffer); computeShader.SetInt("numAgents", numBoidAgents); computeShader.SetInt("numPred", numPredAgents); computeShader.SetFloat("predRadius", settings.predatorRadius); computeShader.SetFloat("viewRadius", settings.viewRadius); computeShader.SetFloat("avoidRadius", settings.avoidRadius); int threadGroups = Mathf.CeilToInt(numBoidAgents / (float)threadGroupSize); computeShader.Dispatch(0, threadGroups, 1, 1); computeBuffer.GetData(buffer); for (int i = 0; i < numBoidAgents; i++) { boids[i].ComputeAgentBehavior(buffer[i].NNCount, buffer[i].avoidCount, buffer[i].predNN, buffer[i].alignmentMove, buffer[i].avoidanceMove, buffer[i].cohesionMove, buffer[i].runDirection, bTarget); //Compute velocity boids[i].UpdateAgent(); } computeBuffer.Release(); if (numPredAgents > 0) { computeBuffer2.Release(); } }
private void Update() { agentDataBuffer[] buffer = new agentDataBuffer[numPredAgents]; for (int i = 0; i < numPredAgents; i++) { buffer[i].position = predators[i].Position; buffer[i].forwardDir = predators[i].ForwardDir; } //Set compute shader properties and data: int size = 3 * 5 * sizeof(float) + 2 * sizeof(int); //size of data buffer var computeBuffer = new ComputeBuffer(numPredAgents, size); computeBuffer.SetData(buffer); computeShader.SetBuffer(0, "boidsData", computeBuffer); computeShader.SetInt("numAgents", numPredAgents); computeShader.SetFloat("viewRadius", settings.viewRadius); computeShader.SetFloat("avoidRadius", settings.avoidRadius); int threadGroups = Mathf.CeilToInt(numPredAgents / (float)threadGroupSize); computeShader.Dispatch(0, threadGroups, 1, 1); computeBuffer.GetData(buffer); for (int i = 0; i < numPredAgents; i++) { predators[i].ComputeAgentBehavior(buffer[i].NNCount, buffer[i].avoidCount, buffer[i].alignmentMove, buffer[i].avoidanceMove, buffer[i].cohesionMove); //Compute vel predators[i].UpdateAgent(); } computeBuffer.Release(); }