Esempio n. 1
0
    private void ResetComputeSim()
    {
        BoidData[] tempArray = new BoidData[NumBoids];
        for (int i = 0; i < NumBoids; ++i)
        {
            tempArray[i].position  = new Vector2(Random.value * TexResolution, Random.value * TexResolution);
            tempArray[i].direction = Random.insideUnitCircle;
            tempArray[i].color     = new Vector4(Random.value, Random.value, Random.value, 1.0f);
        }

        boidBuffer.SetData(tempArray);
        boidBuffer.SetCounterValue((uint)NumBoids);


        /* RENDER */
        int kernelHandle;

        SetShaderValues();

        kernelHandle = shader.FindKernel("CSRenderWipe");
        shader.SetTexture(kernelHandle, "Result", myRt);
        shader.Dispatch(kernelHandle, TexResolution / 8, TexResolution / 8, 1);

        // Render Boids
        kernelHandle = shader.FindKernel("CSRenderMain");
        shader.SetBuffer(kernelHandle, "BoidBuffer", boidBuffer);
        shader.SetTexture(kernelHandle, "Result", myRt);
        shader.Dispatch(kernelHandle, NumBoids / 8, 1, 1);

        rend.material.SetTexture("_MainTex", myRt);
    }
Esempio n. 2
0
        // バッファを初期化
        void InitBuffer()
        {
            // バッファを初期化
            _boidDataBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(BoidData)));
            _boidForceBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(Vector3)));

            //色
            var cols = new Vector3[3]
            {
                new Vector3(Random.value,Random.value,Random.value),
                new Vector3(Random.value,Random.value,Random.value),
                new Vector3(Random.value,Random.value,Random.value)
            };
            
            // Boidデータ, Forceバッファを初期化
            var forceArr = new Vector3[MaxObjectNum];
            var boidDataArr = new BoidData[MaxObjectNum];
            for (var i = 0; i < MaxObjectNum; i++)
            {
                forceArr[i] = Vector3.zero;
                boidDataArr[i].Position = Random.insideUnitSphere * 1.0f;
                boidDataArr[i].Velocity = Random.insideUnitSphere * 0.1f;
                boidDataArr[i].dt = Random.value;
                boidDataArr[i].color = cols[Mathf.FloorToInt(Random.value*cols.Length)];
            }
            _boidForceBuffer.SetData(forceArr);
            _boidDataBuffer.SetData(boidDataArr);
            forceArr = null;
            boidDataArr = null;
        }
Esempio n. 3
0
    private void ResetComputeSim()
    {
        BoidData[] boidArray = new BoidData[boidMaxCount];
        for (int i = 0; i < boidStartCount; ++i)
        {
            boidArray[i].position  = new Vector2(Random.value * TexResolution, Random.value * TexResolution);
            boidArray[i].direction = Random.insideUnitCircle;
            boidArray[i].color     = new Vector4(Random.value, Random.value, Random.value, 1.0f);
        }

        boidBuffer.SetData(boidArray);

        uint[] ConsumeIds = new uint[boidMaxCount];
        for (uint i = 0; i < boidMaxCount; i++)
        {
            ConsumeIds[i] = i;
        }

        indexBuffer0.SetCounterValue(0);
        indexBuffer1.SetCounterValue(0);

        deadIndexBuffer.SetData(ConsumeIds);
        deadIndexBuffer.SetCounterValue((uint)(boidMaxCount));

        useFirstBuffer = true;

        SetShaderValues();
    }
    private void Update()
    {
        if (distroyedAll == false)
        {
            // update boid data
            for (int i = 0; i < _boidCount; i++)
            {
                if (Boids.Count <= 0)
                {
                    continue;
                }

                _boids[i] = new BoidData
                {
                    Position    = Boids[i].transform.position,
                    Forward     = Boids[i].transform.forward,
                    NoiseOffset = Boids[i].NoiseOffset
                };
            }
        }

        // create boid job
        UpdateBoidJob boidJob = new UpdateBoidJob
        {
            Boids          = _boids,
            BoidTuning     = _boidTuning,
            TargetPosition = _boidTarget.position,
            Time           = Time.timeSinceLevelLoad,
            DeltaTime      = Time.deltaTime
        };

        boidJob.Schedule(_boidTransforms).Complete();
    }
Esempio n. 5
0
    protected override void InitializeBuffers()
    {
        //Bufferの初期化(SetLastCS用にダミーデータが一つ必要)
        BoidBuffer    = new ComputeBuffer(BoidsNum + 1, Marshal.SizeOf(typeof(BoidData)));
        _lastIdBuffer = new ComputeBuffer(_bucketSizeXYZ, Marshal.SizeOf(typeof(int)));

        var boidArray = new BoidData[BoidsNum + 1];

        for (var i = 0; i < BoidsNum; i++)
        {
            boidArray[i].Postion  = Random.insideUnitSphere * SpawnSize;
            boidArray[i].Velocity = Random.insideUnitSphere * 1f;
            boidArray[i].Id       = (int)((boidArray[i].Postion.x - _bucketMin.x) / _bucketLength) +
                                    (int)((boidArray[i].Postion.y - _bucketMin.y) / _bucketLength * _bucketSize.x) +
                                    (int)((boidArray[i].Postion.z - _bucketMin.z) / _bucketLength * _bucketSize.x * _bucketSize.y);
        }

        //ダミーデータの作成
        boidArray[BoidsNum].Postion = Vector3.positiveInfinity;
        boidArray[BoidsNum].Id      = int.MaxValue;

        BoidBuffer.SetData(boidArray);

        //バッファの設定
        BoidComputeShader.SetBuffer(KernelId, "_BoidBuffer", BoidBuffer);
        BoidComputeShader.SetBuffer(KernelId, "_LastIDBuffer", _lastIdBuffer);
        BoidComputeShader.SetBuffer(_sortId, "_BoidBuffer", BoidBuffer);
        BoidComputeShader.SetBuffer(_setLastId, "_BoidBuffer", BoidBuffer);
        BoidComputeShader.SetBuffer(_setLastId, "_LastIDBuffer", _lastIdBuffer);
    }
        // 버퍼 초기화
        void InitBuffer()
        {
            // 보이드 데이터 어레이 배열생성
            currBoidDataArray = new BoidData[MaxObjectNum];

            // 버퍼 초기화
            _boidDataBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(BoidData)));
            _boidForceBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(Vector3)));
            _obstacleDataBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(Vector3)));
            
            // Boid 데이터, fORCE 버퍼를 초기화
            var forceArr = new Vector3[MaxObjectNum];
            var boidDataArr = new BoidData[MaxObjectNum];
            var obstacleArr = new Vector3[MaxObjectNum];
            for (var i = 0; i < MaxObjectNum; i++)
            {
                forceArr[i] = Vector3.zero;
                boidDataArr[i].Position = Random.insideUnitSphere * 1.0f;
                boidDataArr[i].Velocity = Random.insideUnitSphere * 0.1f;
                obstacleArr[i] = Vector3.zero;
            }
            _boidForceBuffer.SetData(forceArr);
            _boidDataBuffer.SetData(boidDataArr);
            _obstacleDataBuffer.SetData(obstacleArr);
            forceArr = null;
            boidDataArr = null;
            obstacleArr = null;
        }
Esempio n. 7
0
    void Update()
    {
        //Debug.Log(SystemInfo.supportsComputeShaders);
        if (boids != null && SystemInfo.supportsComputeShaders)
        {
            int numBoids = boids.Length;
            var boidData = new BoidData[numBoids];

            for (int i = 0; i < boids.Length; i++)
            {
                if (boids[i] != null)
                {
                    boidData[i].position  = boids[i].position;
                    boidData[i].direction = boids[i].forward;
                }
            }

            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
            boidBuffer.SetData(boidData);

            compute.SetBuffer(0, "boids", boidBuffer);
            compute.SetInt("numBoids", boids.Length);
            compute.SetFloat("viewRadius", perceptionRadius);
            compute.SetFloat("avoidRadius", avoidanceRadius);

            compute.SetFloat("playerX", player.position.x);
            compute.SetFloat(" playerY", player.position.y);
            compute.SetFloat("range", 20f);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)threadGroupSize);
            compute.Dispatch(0, threadGroups, 1, 1);

            boidBuffer.GetData(boidData);

            for (int i = 0; i < boids.Length; i++)
            {
                if (boidData[i].outOfRange == 1)
                {
                    //Version 2 too difficult
                    //Destroy(boids[i].gameObject);
                    //boids[i] = null;
                    //Debug.Log("Garbage Boid Collected");
                }
                else if (boids[i] != null)
                {
                    boids[i].index                  = i;
                    boids[i].avgFlockHeading        = boidData[i].flockHeading;
                    boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                    boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                    boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;

                    boids[i].UpdateBoid();
                }
            }

            boidBuffer.Release();
        }
    }
Esempio n. 8
0
    void Update()
    {
        if (boids != null && base.Active)
        {
            // cursor stuff
            if (Input.GetMouseButtonDown(0))
            {
                mouseActivated = true;
                if (boidTargetCursor == null)
                {
                    GameObject ob = Instantiate(Resources.Load("Prefabs/Cursor") as GameObject);
                    ob.transform.SetParent(Application.Instance.WorldParent);
                    boidTargetCursor = ob.GetComponent <TextureObject2D>();
                }
                boidTargetCursor.Renderer.material.mainTexture = m_dataAccessor.GetRandomParticle();
            }
            followPoint = Application.Instance.MainCamera.ScreenToWorldPoint(Input.mousePosition);
            if (boidTargetCursor != null)
            {
                boidTargetCursor.transform.position = new Vector3(followPoint.x, followPoint.y, 1);
            }

            // calculate necessary flock data
            int numBoids = boids.Length;
            var boidData = new BoidData[numBoids];

            for (int i = 0; i < boids.Length; i++)
            {
                boidData[i].position  = boids[i].position;
                boidData[i].direction = boids[i].forward;
            }

            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
            boidBuffer.SetData(boidData);

            computeShader.SetBuffer(0, "boids", boidBuffer);
            computeShader.SetInt("numBoids", boids.Length);
            computeShader.SetFloat("viewRadius", settings.perceptionRadius);
            computeShader.SetFloat("avoidRadius", settings.avoidanceRadius);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)THREAD_GROUPSIZE);
            computeShader.Dispatch(0, threadGroups, 1, 1);

            boidBuffer.GetData(boidData);

            for (int i = 0; i < boids.Length; i++)
            {
                boids[i].avgFlockHeading        = boidData[i].flockHeading;
                boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;
                boids[i].Target = mouseActivated ? followPoint : Vector2.zero;

                boids[i].UpdateBoid();
            }
            boidBuffer.Release();
        }
    }
Esempio n. 9
0
    void Update()
    {
        if (_boids != null)
        {
            if (useComputeShader)
            {
                int numBoids = _boids.Count;
                if (numBoids == 0)
                {
                    return;
                }

                var boidData = new BoidData[numBoids];

                for (int i = 0; i < _boids.Count; i++)
                {
                    boidData[i].position  = _boids[i].position;
                    boidData[i].direction = _boids[i].forward;
                }

                var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
                boidBuffer.SetData(boidData);

                compute.SetBuffer(0, "boids", boidBuffer);
                compute.SetInt("numBoids", _boids.Count);
                compute.SetFloat("viewRadius", settings.perceptionRadius * settings.scaleMultiplier);
                compute.SetFloat("avoidRadius", settings.avoidanceRadius * settings.scaleMultiplier);

                int threadGroups = Mathf.CeilToInt(numBoids / (float)threadGroupSize);
                compute.Dispatch(0, threadGroups, 1, 1);

                boidBuffer.GetData(boidData);

                for (int i = 0; i < _boids.Count; i++)
                {
                    _boids[i].avgFlockHeading        = boidData[i].flockHeading;
                    _boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                    _boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                    _boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;

                    _boids[i].UpdateBoid();
                }

                boidBuffer.Release();
            }
            else
            {
                for (int i = 0; i < _boids.Count; i++)
                {
                    _boids[i].UpdateBoid();
                }
            }
        }
    }
Esempio n. 10
0
        public Dictionary <BoidSettings, List <BoidData> > RelevantBoidData(BoidData self)
        {
            Dictionary <BoidSettings, List <BoidData> > relevants = new Dictionary <BoidSettings, List <BoidData> >();

            foreach (var pair in _boidDatum)
            {
                BoidSettings    settings = pair.Key;
                List <BoidData> datum    = pair.Value;
                relevants[settings] = RelevantBoidData(self, settings, datum);
            }
            return(relevants);
        }
Esempio n. 11
0
    void Update()
    {
        if (boids != null)
        {
            string states   = "";
            int    numBoids = boids.Length;
            var    boidData = new BoidData[numBoids];

            for (int i = 0; i < boids.Length; i++)
            {
                boidData[i].position  = boids[i].position;
                boidData[i].direction = boids[i].forward;
                if (i < boids.Length - 1)
                {
                    states += boids[i].position.ToString();
                    states += boids[i].forward.ToString();
                }
                Debug.Log(boids[i].position);
                Debug.Log(boids[i].forward);
            }
            Debug.Log(states);
            using (System.IO.StreamWriter file =
                       new System.IO.StreamWriter(@"C:\Users\pls19\Boids\simulation_data.txt", true))
            {
                file.WriteLine(states);
            }
            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
            boidBuffer.SetData(boidData);

            compute.SetBuffer(0, "boids", boidBuffer);
            compute.SetInt("numBoids", boids.Length);
            compute.SetFloat("viewRadius", settings.perceptionRadius);
            compute.SetFloat("avoidRadius", settings.avoidanceRadius);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)threadGroupSize);
            compute.Dispatch(0, threadGroups, 1, 1);

            boidBuffer.GetData(boidData);

            for (int i = 0; i < boids.Length; i++)
            {
                boids[i].avgFlockHeading        = boidData[i].flockHeading;
                boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;

                boids[i].UpdateBoid();
            }

            boidBuffer.Release();
        }
    }
Esempio n. 12
0
    private static void FullUpdate(ref Translation position, ref Rotation rotation, ref BoidData boid, NativeArray <BoidData> boidsData,
                                   float agentNeighbourDistance, float agentAvoidDistance, float3 goalPos, float deltaTime,
                                   float minSpeed, float maxSpeed, Bounds bounds, uint baseSeed, float avoidCollidersDistance, PhysicsWorld world)
    {
        float3 direction = float3.zero;
        float3 forward   = math.forward(rotation.Value);
        bool   turning;

        RaycastInput rayInput = new RaycastInput
        {
            Start  = boid.CurrentPosition,
            End    = boid.CurrentPosition + avoidCollidersDistance * forward,
            Filter = CollisionFilter.Default
        };

        if (!bounds.Contains(boid.CurrentPosition)) //handle getting out of bounds
        {
            turning   = true;
            direction = (float3)bounds.center - boid.CurrentPosition;
        }
        else if (world.CastRay(rayInput, out Unity.Physics.RaycastHit hit))
        {
            turning   = true;
            direction = (float3)Vector3.Reflect(forward, hit.SurfaceNormal);
        }
        else
        {
            turning = false;
        }

        if (turning) //adjust path if needed
        {
            rotation.Value = math.slerp(rotation.Value, quaternion.LookRotation(direction, new float3(0, 1, 0)), boid.RotationSpeed * deltaTime);
        }
        else //random direction or direction calculated based on the flocking rules
        {
            Unity.Mathematics.Random rand = new Unity.Mathematics.Random(baseSeed + boid.Index);

            if (rand.NextInt(0, 100) < 10)
            {
                boid.Speed = rand.NextFloat(minSpeed, maxSpeed);
            }
            if (rand.NextInt(0, 100) < 20)
            {
                ApplyBoidRules(ref boid, ref rotation, boidsData, agentNeighbourDistance, agentAvoidDistance, goalPos, deltaTime);
            }
        }

        //move agent forward, along its direction
        position.Value      += boid.Speed * math.forward(rotation.Value) * deltaTime;
        boid.CurrentPosition = position.Value;
    }
Esempio n. 13
0
    private BoidData[] InitBoidData()
    {
        BoidData[] dataArray = new BoidData[BoidCount];
        for (int i = 0; i < BoidCount; i++)
        {
            Vector3 pos = new Vector3(Random.value, Random.value, Random.value) * 2 - Vector3.one;
            pos *= BOUND_SIZE;
            dataArray[i].pos = pos;

            dataArray[i].forward = Vector3.forward; // new Vector3(Random.value, Random.value, Random.value) * 360;
            dataArray[i].scale   = Vector3.one;
        }

        return(dataArray);
    }
Esempio n. 14
0
    // Update all the boids at each frame
    void Update()
    {
        if (boids != null && boids.Count != 0)
        {
            int numBoids = boids.Count;

            // create a list of data structures, one for each boid, to be fed to the compute shader
            var boidData = new BoidData[numBoids];

            // set the position and the direction of each boid in the data structure
            for (int i = 0; i < boids.Count; i++)
            {
                boidData[i].position  = boids[i].position;
                boidData[i].direction = boids[i].forward;
            }

            // create a buffer to send information to the compute shader
            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);

            boidBuffer.SetData(boidData);

            // set the variables of the compute shader
            compute.SetBuffer(0, "boids", boidBuffer);
            compute.SetInt("numBoids", boids.Count);
            compute.SetFloat("viewRadius", settings.perceptionRadius);
            compute.SetFloat("avoidRadius", settings.avoidanceRadius);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)threadGroupSize);
            compute.Dispatch(0, threadGroups, 1, 1);

            // get back the data computed by the shader
            boidBuffer.GetData(boidData);

            // update the attributes of each boid from the compute shader informations
            for (int i = 0; i < boids.Count; i++)
            {
                boids[i].avgFlockHeading        = boidData[i].flockHeading;
                boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;

                // update the velocity and the direction of each boid
                boids[i].UpdateBoid();
            }

            boidBuffer.Release();
        }
    }
Esempio n. 15
0
    protected virtual void InitializeBuffers()
    {
        //Bufferの初期化
        BoidBuffer = new ComputeBuffer(BoidsNum, Marshal.SizeOf(typeof(BoidData)));

        var boidArray = new BoidData[BoidsNum];

        for (var i = 0; i < BoidsNum; i++)
        {
            boidArray[i].Postion  = Random.insideUnitSphere * SpawnSize;
            boidArray[i].Velocity = Random.insideUnitSphere * 0.1f;
        }

        BoidBuffer.SetData(boidArray);
        BoidComputeShader.SetBuffer(KernelId, "_BoidBuffer", BoidBuffer);
    }
Esempio n. 16
0
    private void ResetComputeSim()
    {
        BoidData[] tempArray = new BoidData[NumBoids];
        for (int i = 0; i < NumBoids; ++i)
        {
            tempArray[i].position  = new Vector2(Random.value * TexResolution, Random.value * TexResolution);
            tempArray[i].direction = Random.insideUnitCircle * MaxSpeed;
            tempArray[i].color     = new Vector4(Random.value, Random.value, Random.value, 1.0f);
        }

        boidBuffer.SetData(tempArray);
        boidBuffer.SetCounterValue((uint)NumBoids);
        isAltFrame = false;

        bDoUpdate = true;
        ComputeStepFrame();
        bDoUpdate = false;
    }
Esempio n. 17
0
    void Update()
    {
        if (boids != null && boids.Count > 0)
        {
            int numBoids = boids.Count;
            var boidData = new BoidData[numBoids];

            for (int i = 0; i < boids.Count; i++)
            {
                boidData[i].position  = boids[i].position;
                boidData[i].direction = boids[i].forward;
            }
            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
            boidBuffer.SetData(boidData);

            compute.SetBuffer(0, "boids", boidBuffer);
            compute.SetInt("numBoids", boids.Count);
            compute.SetFloat("viewRadius", settings.perceptionRadius);
            compute.SetFloat("avoidRadius", settings.avoidanceRadius);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)threadGroupSize);
            compute.Dispatch(0, threadGroups, 1, 1);

            boidBuffer.GetData(boidData);

            for (int i = 0; i < boids.Count; i++)
            {
                boids[i].avgFlockHeading        = boidData[i].flockHeading;
                boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;

                boids[i].UpdateBoid();
                if (boids[i].health <= 0)
                {
                    Destroy(boids[i].gObj);
                    boids.RemoveAt(i);
                    i--;
                }
            }

            boidBuffer.Release();
        }
    }
Esempio n. 18
0
    private void InitBuffers()
    {
        boidDataBuffer  = new ComputeBuffer((int)maxObjectNum, Marshal.SizeOf(typeof(BoidData)));
        boidForceBuffer = new ComputeBuffer((int)maxObjectNum, Marshal.SizeOf(typeof(Vector3)));

        var boidForces = new Vector3[maxObjectNum];
        var boidDatas  = new BoidData[maxObjectNum];

        for (int i = 0; i < maxObjectNum; i++)
        {
            boidForces[i]         = Vector3.zero;
            boidDatas[i].Position = UnityEngine.Random.insideUnitSphere * 1f;
            boidDatas[i].Velocity = UnityEngine.Random.insideUnitSphere * 0.1f;
        }
        boidForceBuffer.SetData(boidForces);
        boidDataBuffer.SetData(boidDatas);
        boidForces = null;
        boidDatas  = null;
    }
Esempio n. 19
0
    void Update()
    {
        if (boids != null)
        {
            int numBoids = boids.Length;
            var boidData = new BoidData[numBoids];

            for (int i = 0; i < boids.Length; i++)
            {
                boidData[i].position  = boids[i].position;
                boidData[i].direction = boids[i].forward;
            }

            //var boidBuffer = new ComputeBuffer (numBoids, BoidData.Size);
            //boidBuffer.SetData (boidData);

            //compute.SetBuffer (0, "boids", boidBuffer);
            //compute.SetInt ("numBoids", boids.Length);
            //compute.SetFloat ("viewRadius", settings.perceptionRadius);
            //compute.SetFloat ("avoidRadius", settings.avoidanceRadius);

            //int threadGroups = Mathf.CeilToInt (numBoids / (float) threadGroupSize);
            //compute.Dispatch (0, threadGroups, 1, 1);

            //boidBuffer.GetData (boidData);

            for (int i = 0; i < boids.Length; i++)
            {
                boids[i].avgFlockHeading        = boidData[i].flockHeading;
                boids[i].centreOfFlockmates     = boidData[i].flockCentre;
                boids[i].avgAvoidanceHeading    = boidData[i].avoidanceHeading;
                boids[i].numPerceivedFlockmates = boidData[i].numFlockmates;

                if (boids[i] != null)
                {
                    boids[i].UpdateBoid();
                }
            }

            //boidBuffer.Release ();
        }
    }
Esempio n. 20
0
    private void ResetComputeSim()
    {
        BoidData[] tempArray = new BoidData[NumBoids];
        for (int i = 0; i < NumBoids; ++i)
        {
            tempArray[i].position  = new Vector2(Random.value * TexResolution, Random.value * TexResolution);
            tempArray[i].direction = Random.insideUnitCircle;
            tempArray[i].color     = new Vector4(Random.value, Random.value, Random.value, 1.0f);
        }

        boidBuffer.SetData(tempArray);
        boidBuffer.SetCounterValue((uint)NumBoids);


        /* RENDER */
        int   kernelHandle;
        float InvWeight = 1.0f / Weight;

        shader.SetInt("NumBoids", NumBoids);
        shader.SetFloats("Params", new float[4] {
            RepelDist, RepelForce, InfluenceMaxDist, AttractStrength
        });
        shader.SetFloats("Params2", new float[4] {
            FlockDirStrength, InvWeight, Time.deltaTime * DeltaMod, TexResolution
        });
        shader.SetFloats("AttractPoint", new float[4] {
            AtrractPoint.x, AtrractPoint.y, AttractPointStrength, 0
        });
        shader.SetFloats("WipeColour", new float[] { 0, 0, 0, 0 });

        kernelHandle = shader.FindKernel("CSRenderWipe");
        shader.SetTexture(kernelHandle, "Result", myRt);
        shader.Dispatch(kernelHandle, TexResolution / 8, TexResolution / 8, 1);

        // Render Boids
        kernelHandle = shader.FindKernel("CSRenderMain");
        shader.SetBuffer(kernelHandle, "BoidBuffer", boidBuffer);
        shader.SetTexture(kernelHandle, "Result", myRt);
        shader.Dispatch(kernelHandle, NumBoids / 8, 1, 1);

        rend.material.SetTexture("_MainTex", myRt);
    }
Esempio n. 21
0
    private void Update()
    {
        int NumBoids = Boids.Count;

        if (NumBoids == 0)
        {
            return;
        }
        var boidData = new BoidData[NumBoids];

        for (int i = 0; i < NumBoids; i++)
        {
            boidData[i].Position  = Boids[i].transform.position;
            boidData[i].Direction = Boids[i].transform.forward;
        }

        ComputeBuffer Buffer = new ComputeBuffer(NumBoids, BoidData.Size);

        Buffer.SetData(boidData);

        Compute.SetBuffer(0, "boids", Buffer);
        Compute.SetInt("numBoids", Boids.Count);
        Compute.SetFloat("viewRadius", Settings.PerceptionRadius);
        Compute.SetFloat("avoidRadius", Settings.AvoidanceRadius);

        int ThreadGroups = Mathf.CeilToInt(NumBoids / (float)ThreadGroupSize);

        Compute.Dispatch(0, ThreadGroups, 1, 1);

        Buffer.GetData(boidData);

        for (int i = 0; i < Boids.Count; i++)
        {
            Boids[i].AverageFlockHeading     = boidData[i].FlockHeading;
            Boids[i].CentreOfFlockmates      = boidData[i].FlockCentre;
            Boids[i].AverageAvoidanceHeading = boidData[i].AvoidanceHeading;
            Boids[i].NumPerceivedFlockmates  = boidData[i].NumFlockmates;

            Boids[i].UpdateBoy();
        }
        Buffer.Release();
    }
Esempio n. 22
0
    void InitBuffer()
    {
        _boidDataBuffer  = new ComputeBuffer(MaxObjectNum, Marshal.SizeOf(typeof(BoidData)));
        _boidForceBuffer = new ComputeBuffer(MaxObjectNum, Marshal.SizeOf(typeof(Vector3)));

        var forceArr    = new Vector3[MaxObjectNum];
        var boidDataArr = new BoidData[MaxObjectNum];

        for (var i = 0; i < MaxObjectNum; i++)
        {
            forceArr[i]             = Vector3.zero;
            boidDataArr[i].Position = Random.insideUnitSphere * 1.0f;
            boidDataArr[i].Velocity = Random.insideUnitSphere * 1.0f;

            _boidDataBuffer.SetData(boidDataArr);
            _boidForceBuffer.SetData(forceArr);
            boidDataArr = null;
            forceArr    = null;
        }
    }
Esempio n. 23
0
    /// <summary>
    //  Called once for each frame.
    /// </summary>
    private void Update()
    {
        if (_Boids != null)
        {
            // Extract the vector position and direction only from the boids (since were calculating on the GPU)
            int numBoids = _Boids.Length;
            var boidData = new BoidData[numBoids];

            for (int i = 0; i < _Boids.Length; i++)
            {
                boidData[i].position  = _Boids[i].GetPosition();
                boidData[i].direction = _Boids[i].GetForward();
            }

            // Using a compute shader for optimization
            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
            boidBuffer.SetData(boidData);

            ComputeShader.SetBuffer(0, "boids", boidBuffer);
            ComputeShader.SetInt("numBoids", numBoids);
            ComputeShader.SetFloat("viewRadius", BoidSettings.PerceptionRadius);
            ComputeShader.SetFloat("avoidRadius", BoidSettings.AvoidanceRadius);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)_ThreadGroupSize);
            ComputeShader.Dispatch(0, threadGroups, 1, 1);

            boidBuffer.GetData(boidData);

            // Update individual boid instances with the data pulled from the compute shader
            for (int i = 0; i < _Boids.Length; i++)
            {
                _Boids[i].SetAverageAvoidanceHeading(boidData[i].avoidanceHeading);
                _Boids[i].SetAverageFlockHeading(boidData[i].flockHeading);
                _Boids[i].SetCenterOfFlock(boidData[i].flockCenter);
                _Boids[i].SetFlockSize(boidData[i].numFlockmates);

                _Boids[i].UpdateBoid();
            }
            boidBuffer.Release();
        }
    }
    void Update()
    {
        fps = 1f / Time.deltaTime;

        if (boids.Length > 0)
        {
            int numBoids = boids.Length;
            var boidData = new BoidData[numBoids];

            for (int i = 0; i < boids.Length; i++)
            {
                boidData[i].position  = boids[i].position;
                boidData[i].direction = boids[i].transform.forward.normalized;
            }

            var boidBuffer = new ComputeBuffer(numBoids, BoidData.Size);
            boidBuffer.SetData(boidData);

            compute.SetBuffer(0, "boids", boidBuffer);
            compute.SetInt("numBoids", boids.Length);
            compute.SetFloat("viewRadius", settings.CohesionRadius);
            compute.SetFloat("avoidRadius", settings.SeparationRadius);

            int threadGroups = Mathf.CeilToInt(numBoids / (float)threadGroupSize);
            compute.Dispatch(0, threadGroups, 1, 1);

            boidBuffer.GetData(boidData);

            for (int i = 0; i < boids.Length; i++)
            {
                boids[i].flockMovingDirection     = boidData[i].flockHeading;
                boids[i].flockCenter              = boidData[i].flockCentre;
                boids[i].flockSeparationDirection = boidData[i].avoidanceHeading;
                boids[i].numberOfNeighbours       = boidData[i].numFlockmates;

                boids[i].ComputeAcceleration();
            }

            boidBuffer.Release();
        }
    }
Esempio n. 25
0
    private static void ApplyBoidRules(ref BoidData boid, ref Rotation rotation, NativeArray <BoidData> boidsData,
                                       float agentNeighbourDistance, float agentAvoidDistance, float3 goalPos, float deltaTime)
    {
        float3 centre     = float3.zero;
        float3 avoid      = float3.zero;
        float  groupSpeed = 0.01f;
        float  neighbourDistance;
        int    groupSize = 0;

        for (int i = 0; i < boidsData.Length; i++)
        {
            if (boid.Index != boidsData[i].Index)
            {
                float3 boidsVector = boid.CurrentPosition - boidsData[i].CurrentPosition;
                neighbourDistance = math.length(boidsVector);
                if (neighbourDistance <= agentNeighbourDistance)
                {
                    groupSize++;
                    groupSpeed += boidsData[i].Speed;
                    centre     += boidsData[i].CurrentPosition;
                    if (neighbourDistance < agentAvoidDistance)
                    {
                        avoid += boidsVector;
                    }
                }
            }
        }

        if (groupSize > 0)
        {
            centre    /= groupSize;
            boid.Speed = groupSpeed / groupSize;

            float3 direction = (centre + goalPos + avoid) - boid.CurrentPosition;
            if (math.length(direction - float3.zero) > 0.05f)
            {
                rotation.Value = math.slerp(rotation.Value, quaternion.LookRotation(direction, new float3(0, 1, 0)), boid.RotationSpeed * deltaTime);
            }
        }
    }
Esempio n. 26
0
    void CalculateFishData()
    {
        //we generate an array to pass the data from the cpu to the gpu
        int numFishes = componentes.Count;

        BoidData[] data = new BoidData[numFishes];
        //filling the array with actual framedata
        for (int i = 0; i < numFishes; i++)
        {
            data[i].position  = componentes[i].transform.position;
            data[i].direction = componentes[i].transform.forward;
        }
        //we create the buffer to pass the data
        ComputeBuffer dataBuffer = new ComputeBuffer(numFishes, BoidData.Size);

        dataBuffer.SetData(data);
        //we pass the values to the GPU, setBuffer gets a kernelIndex (0 since we only have one, other wise should use FindKernel with the name of the function)
        compute.SetBuffer(0, "boids", dataBuffer);
        compute.SetInt("numFishes", numFishes);
        compute.SetFloat("viewRadius", settings.sightRadius);
        compute.SetFloat("avoidRadius", settings.avoidRadius);

        int threadGroups = Mathf.CeilToInt(numFishes / (float)threadGroupSize);

        compute.Dispatch(0, threadGroups, 1, 1);

        dataBuffer.GetData(data);
        for (int i = 0; i < numFishes; i++)
        {
            componentes[i].avoidanceDirection = data[i].avoidanceDirection;
            componentes[i].flockCenter        = data[i].flockCenter;
            componentes[i].flockDirection     = data[i].flockHeading;
            componentes[i].numFlockMates      = data[i].numFlockmates;

            componentes[i].UpdateFish();
        }
        //Debug.Log(data[10].numFlockmates);

        dataBuffer.Release();
    }
        // バッファを初期化
        void InitBuffer()
        {
            // バッファを初期化
            _boidDataBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(BoidData)));
            _boidForceBuffer = new ComputeBuffer(MaxObjectNum,
                Marshal.SizeOf(typeof(Vector3)));

            // Boidデータ, Forceバッファを初期化
            var forceArr = new Vector3[MaxObjectNum];
            var boidDataArr = new BoidData[MaxObjectNum];
            for (var i = 0; i < MaxObjectNum; i++)
            {
                forceArr[i] = Vector3.zero;
                boidDataArr[i].Position = transform.position + Random.insideUnitSphere * 1.0f;
                boidDataArr[i].Velocity = Random.insideUnitSphere * 0.1f;
            }
            _boidForceBuffer.SetData(forceArr);
            _boidDataBuffer.SetData(boidDataArr);
            forceArr = null;
            boidDataArr = null;
        }
    void InitBuffer()
    {
        _boidDataBuffer      = new ComputeBuffer(MaxObjectNum, Marshal.SizeOf(typeof(BoidData)));
        _boidinfluenceBuffer = new ComputeBuffer(MaxObjectNum, Marshal.SizeOf(typeof(InfluenceData)));

        var influenceArr = new InfluenceData[MaxObjectNum];
        var boidDataArr  = new BoidData[MaxObjectNum];

        for (var i = 0; i < MaxObjectNum; i++)
        {
            influenceArr[i].Force     = Vector3.zero;
            influenceArr[i].Luminance = 0.5f;
            boidDataArr[i].Position   = Random.insideUnitSphere * 20.0f;
            boidDataArr[i].Velocity   = Random.insideUnitSphere * 20.0f;
            boidDataArr[i].Scale      = Random.Range(0.8f, 2.0f);
            boidDataArr[i].Luminance  = 0.5f;
        }
        _boidinfluenceBuffer.SetData(influenceArr);
        _boidDataBuffer.SetData(boidDataArr);
        influenceArr = null;
        boidDataArr  = null;
    }
Esempio n. 29
0
        /// <summary>
        /// バッファを初期化
        /// </summary>
        void InitBuffer()
        {
            boidForceBuffer = new ComputeBuffer(maxObjectNum, Marshal.SizeOf(typeof(Vector3)));
            boidDataBuffer  = new ComputeBuffer(maxObjectNum, Marshal.SizeOf(typeof(BoidData)));

            // Boidデータ、Forceバッファを初期化
            var forceArr    = new Vector3[maxObjectNum];
            var boidDataArr = new BoidData[maxObjectNum];

            for (var i = 0; i < maxObjectNum; ++i)
            {
                forceArr[i]             = Vector3.zero;
                boidDataArr[i].position = Random.insideUnitSphere * 1f;
                boidDataArr[i].velocity = Random.insideUnitSphere * 0.1f;
            }

            boidForceBuffer.SetData(forceArr);
            boidDataBuffer.SetData(boidDataArr);

            forceArr    = null;
            boidDataArr = null;
        }
Esempio n. 30
0
    private void Update()
    {
        if (boids == null)
        {
            return;
        }

        var boidData = new BoidData[boids.Length];// new NativeArray<BoidData>(boids.Length, Allocator.TempJob);

        for (int i = 0; i < boids.Length; i++)
        {
            boidData[i].position  = boids[i].Position;
            boidData[i].direction = boids[i].Forward;
        }

        ComputeBuffer buffer = new ComputeBuffer(boids.Length, BoidData.Size);

        buffer.SetData(boidData);

        ComputeShader.SetBuffer(0, "boids", buffer);
        ComputeShader.SetInt("numBoids", boids.Length);
        ComputeShader.SetFloat("viewRadius", SystemSettings.PerceptionRadius);
        ComputeShader.SetFloat("avoidRadius", SystemSettings.AvoidanceRadius);

        int threadGroups = Mathf.CeilToInt(boids.Length / (float)1024);

        ComputeShader.Dispatch(0, threadGroups, 1, 1);

        buffer.GetData(boidData);

        //boids[0].UpdateRandom();

        for (int i = 0; i < boids.Length; i++)
        {
            boids[i].UpdateSelf(boidData[i]);
        }

        buffer.Release();
    }