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); }
// バッファを初期化 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; }
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(); }
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; }
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(); } }
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(); } }
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(); } } } }
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); }
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(); } }
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; }
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); }
// 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(); } }
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); }
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; }
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(); } }
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; }
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 (); } }
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); }
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(); }
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; } }
/// <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(); } }
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); } } }
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; }
/// <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; }
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(); }