Beispiel #1
0
 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];
     }
 }
Beispiel #2
0
 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;
 }
Beispiel #3
0
 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);
     }
 }
Beispiel #4
0
 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);
 }
Beispiel #5
0
    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;
        }
    }
Beispiel #6
0
    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);
    }
Beispiel #7
0
    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);
    }
Beispiel #8
0
    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);
    }
Beispiel #9
0
    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);
    }
Beispiel #10
0
    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);
        }
    }
Beispiel #11
0
 private int GetNext(GParticleGPU p, int i)
 {
     return(GetNext(p, i, i));
 }