public void SetLinks(ref GParticleGPU p, List <int> list) { if (list.Count > 0) { p.link00 = list[0]; } if (list.Count > 1) { p.link01 = list[1]; } if (list.Count > 2) { p.link02 = list[2]; } if (list.Count > 3) { p.link03 = list[3]; } if (list.Count > 4) { p.link04 = list[4]; } if (list.Count > 5) { p.link05 = list[5]; } if (list.Count > 6) { p.link06 = list[6]; } if (list.Count > 7) { p.link07 = list[7]; } }
public void InitLinks(ref GParticleGPU p) { p.link00 = -1; p.link01 = -1; p.link02 = -1; p.link03 = -1; p.link04 = -1; p.link05 = -1; p.link06 = -1; p.link07 = -1; }
private void ConnectCell(ref GParticleGPU left, ref GParticleGPU right, int i, int j) { if (!ContainsLink(right, i)) { AddLink(ref right, i); } if (!ContainsLink(left, j)) { AddLink(ref left, j); } }
public bool ContainsLink(GParticleGPU cell, int target) { return(cell.link00 == target || cell.link01 == target || cell.link02 == target || cell.link03 == target || cell.link04 == target || cell.link05 == target || cell.link06 == target || cell.link07 == target); }
public void AddLink(ref GParticleGPU cell, int target) { switch (cell.numLinks) { case 0: cell.link00 = target; cell.numLinks++; break; case 1: cell.link01 = target; cell.numLinks++; break; case 2: cell.link02 = target; cell.numLinks++; break; case 3: cell.link03 = target; cell.numLinks++; break; case 4: cell.link04 = target; cell.numLinks++; break; case 5: cell.link05 = target; cell.numLinks++; break; case 6: cell.link06 = target; cell.numLinks++; break; case 7: cell.link07 = target; cell.numLinks++; break; default: Debug.LogError("too many links"); break; } }
public void Init(Mesh m) { List <GParticleGPU> particleList = new List <GParticleGPU>(); for (int i = 0; i < m.vertexCount; i++) { GParticleGPU p = new GParticleGPU(); InitLinks(ref p); p.position = m.vertices[i]; p.normal = m.normals[i]; particleList.Add(p); if (i == 0) { p.food = 10; } } particleArray = particleList.ToArray(); for (int i = 0; i < m.GetIndexCount(0); i += 3) { var ii = m.GetIndices(0)[i]; var jj = m.GetIndices(0)[i + 1]; ConnectCell(ref particleArray[ii], ref particleArray[jj], ii, jj); ii = m.GetIndices(0)[i]; jj = m.GetIndices(0)[i + 2]; ConnectCell(ref particleArray[ii], ref particleArray[jj], ii, jj); ii = m.GetIndices(0)[i + 1]; jj = m.GetIndices(0)[i + 2]; ConnectCell(ref particleArray[ii], ref particleArray[jj], ii, jj); } m_particleBuffer = new ComputeBuffer(MAX_PARTICLES, SIZE_PARTICLE, ComputeBufferType.Counter); m_particleBuffer.SetData(particleArray); m_particleBuffer.SetCounterValue((uint)particleArray.Length); m_currentNumParticles = particleArray.Length; m_triangleBuffer = new ComputeBuffer(MAX_PARTICLES * 16, SIZE_TRIANGLE, ComputeBufferType.Append); m_triangleArgBuffer = new ComputeBuffer(4, sizeof(int), ComputeBufferType.IndirectArguments); m_particleArgBuffer = new ComputeBuffer(4, sizeof(int), ComputeBufferType.IndirectArguments); }
private int GetNext(GParticleGPU p, int previousIndex, int currentIndex) { Debug.Log($"{previousIndex} - {currentIndex}"); GParticleGPU current = particleArray[currentIndex]; for (int i = 0; i < p.numLinks; i++) { for (int j = 0; j < current.numLinks; j++) { if ((GetLink(p, i) == GetLink(current, j)) && (GetLink(p, i) != previousIndex) && (GetLink(p, i) != currentIndex)) { return(GetLink(p, i)); } } } return(-1); }
private void OrderNeighbors(ref GParticleGPU p) { if (p.numLinks < 3) { return; } List <int> orderedLinks = new List <int>(); orderedLinks.Add(GetLink(p, 0)); orderedLinks.Add(GetNext(p, GetLink(p, 0))); for (int i = 2; i < p.numLinks; i++) { orderedLinks.Add( GetNext(p, orderedLinks[i - 2], orderedLinks[i - 1])); } SetLinks(ref p, orderedLinks); }
public string PrintLinks(GParticleGPU cell) { string result = string.Empty; if (cell.numLinks > 0) { result += cell.link00; } if (cell.numLinks > 1) { result += ", " + cell.link01; } if (cell.numLinks > 2) { result += ", " + cell.link02; } if (cell.numLinks > 3) { result += ", " + cell.link03; } if (cell.numLinks > 4) { result += ", " + cell.link04; } if (cell.numLinks > 5) { result += ", " + cell.link05; } if (cell.numLinks > 6) { result += ", " + cell.link06; } if (cell.numLinks > 7) { result += ", " + cell.link07; } return(result); }
public int GetLink(GParticleGPU cell, int i) { switch (i) { case 0: return(cell.link00); case 1: return(cell.link01); case 2: return(cell.link02); case 3: return(cell.link03); case 4: return(cell.link04); case 5: return(cell.link05); case 6: return(cell.link06); case 7: return(cell.link07); default: return(-99); } }
private int GetNext(GParticleGPU p, int i) { return(GetNext(p, i, i)); }