Example #1
0
        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();
            }
        }
Example #2
0
    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();
    }