Exemplo n.º 1
0
 public void DeleteLink(int _index, DestroyFn destroyFn = null)
 {
     if (destroyFn != null)
     {
         destroyFn(links[_index]);
     }
     else
     {
         DestroyImmediate(links[_index]);
     }
     for (int i = _index + 1; i < links.Length; ++i)
     {
         TxLinkHandle link = links[i];
         links[--link.index] = link;
     }
     System.Array.Resize(ref links, links.Length - 1);
     foreach (TxTruss.NamedSet s in trussData.linksSet)
     {
         List <int> newIndices = new List <int>();
         for (int i = 0; i < s.indices.Length; ++i)
         {
             if (s.indices[i] < _index)
             {
                 newIndices.Add(s.indices[i]);
             }
             else if (s.indices[i] > _index)
             {
                 newIndices.Add(s.indices[i] - 1);
             }
         }
         s.indices = newIndices.ToArray();
     }
 }
Exemplo n.º 2
0
    int FindLink(List <int> linkRest, List <int> doesAffect, List <int> doesntAffect)
    {
        int goodIndex     = -1;
        int veryGoodIndex = -1;

        for (int i = 0; i < linkRest.Count; ++i)
        {
            int          index = linkRest[i];
            TxLinkHandle link  = links[index];
            int          node0 = link.node0;
            int          node1 = link.node1;
            if (doesntAffect.IndexOf(node0) == -1 && doesntAffect.IndexOf(node1) == -1)
            {
                if (goodIndex == -1)
                {
                    goodIndex = index;
                }
                if (doesAffect.IndexOf(node0) != -1 || doesAffect.IndexOf(node1) != -1)
                {
                    if (veryGoodIndex == -1)
                    {
                        goodIndex     = index;
                        veryGoodIndex = index;
                    }
                    if (doesAffect.IndexOf(node0) != -1 && doesAffect.IndexOf(node1) != -1)
                    {
                        return(index);
                    }
                }
            }
        }
        return(goodIndex);
    }
Exemplo n.º 3
0
    public void Optimize()
    {
        int[]      remapLinks = RemapLinks();
        List <int> remapNodes = new List <int>();

        for (int i = 0; i < remapLinks.Length; ++i)
        {
            TxLinkHandle link = links[remapLinks[i]];
            link.index = i;
            int node0 = remapNodes.IndexOf(link.node0);
            if (node0 == -1)
            {
                node0 = remapNodes.Count; remapNodes.Add(link.node0);
            }
            link.node0 = node0;
            int node1 = remapNodes.IndexOf(link.node1);
            if (node1 == -1)
            {
                node1 = remapNodes.Count; remapNodes.Add(link.node1);
            }
            link.node1 = node1;
        }
        foreach (TxNodeHandle n in nodes)
        {
            int index = remapNodes.IndexOf(n.index);
            if (index == -1)
            {
                index = remapNodes.Count; remapNodes.Add(n.index);
            }
            n.index = index;
        }
        foreach (TxFaceHandle f in faces)
        {
            f.node0 = nodes[f.node0].index;
            f.node1 = nodes[f.node1].index;
            f.node2 = nodes[f.node2].index;
        }
        TxTruss data = trussData;

        foreach (TxTruss.NamedSet s in data.nodesSet)
        {
            for (int i = 0; i < s.indices.Length; ++i)
            {
                s.indices[i] = nodes[s.indices[i]].index;
            }
        }
        foreach (TxTruss.NamedSet s in data.linksSet)
        {
            for (int i = 0; i < s.indices.Length; ++i)
            {
                s.indices[i] = links[s.indices[i]].index;
            }
        }
        UpdateHandles();
        DestroyHandles();
        CreateHandles();
    }
Exemplo n.º 4
0
    public TxLinkHandle CreateLink(int _node0, int _node1)
    {
        TxLinkHandle handle = TxLinkHandle.CreateInstance();

        handle.index = links.Length;
        handle.node0 = _node0;
        handle.node1 = _node1;
        handle.name  = string.Format("L({0},{1})", _node0, _node1);
        System.Array.Resize(ref links, links.Length + 1);
        links[handle.index] = handle;
        return(handle);
    }
Exemplo n.º 5
0
    void CreateHandles()
    {
        TxTruss data = trussData;

        if (data == null)
        {
            return;
        }

        nodes = new TxNodeHandle[data.nodeCount];
        for (int i = 0; i < data.nodeCount; ++i)
        {
            TxNodeHandle node = TxNodeHandle.CreateInstance();
            node.index    = i;
            node.name     = string.Format("N({0})", i);
            node.position = data.nodePosition[i];
            node.mass     = data.nodeMass[i];
            nodes[i]      = node;
        }

        links = new TxLinkHandle[data.linkCount];
        for (int i = 0; i < data.linkCount; ++i)
        {
            TxLinkHandle link = TxLinkHandle.CreateInstance();
            link.index      = i;
            link.node0      = data.linkNodes[i * 2 + 0];
            link.node1      = data.linkNodes[i * 2 + 1];
            link.name       = string.Format("L({0},{1})", link.node0, link.node1);
            link.stiffness  = data.linkStiffness[i];
            link.damping    = data.linkDamping[i];
            link.elastic    = data.linkElastic[i];
            link.breaking   = data.linkBreaking[i];
            link.stretching = data.linkStretching.Length > 0 ? data.linkStretching[i] : 1.0f;
            link.resist     = (TxLinkHandle.Resist)(data.linkFlags[i] & 0x3);
            links[i]        = link;
        }

        faces = new TxFaceHandle[data.faceCount];
        for (int i = 0; i < data.faceCount; ++i)
        {
            TxFaceHandle face = TxFaceHandle.CreateInstance();
            face.index     = i;
            face.node0     = data.faceNodes[i * 3 + 0];
            face.node1     = data.faceNodes[i * 3 + 1];
            face.node2     = data.faceNodes[i * 3 + 2];
            face.name      = string.Format("F({0},{1},{2})", face.node0, face.node1, face.node2);
            face.collision = (data.faceFlags[i] & (1 << 0)) != 0;
            face.skinning  = (data.faceFlags[i] & (1 << 1)) != 0;
            face.matter    = data.faceMatter.Length > 0 ? data.faceMatter[i] : 0;
            face.envelope  = data.faceEnvelope[i];
            faces[i]       = face;
        }
    }
Exemplo n.º 6
0
    public int[] RemapLinks()
    {
        List <int> linkRemap = new List <int>();
        List <int> linkRest  = new List <int>();

        for (int i = 0; i < links.Length; ++i)
        {
            linkRest.Add(i);
        }
        List <int> doesAffect   = new List <int>();
        List <int> doesntAffect = new List <int>();

        for (int i = 0; i < links.Length; i += 4)
        {
            for (int j = 0; j < 4; ++j)
            {
                int index = FindLink(linkRest, doesAffect, doesntAffect);
                if (index == -1)
                {
                    linkRemap.AddRange(linkRest);
                    return(linkRemap.ToArray());
                }
                linkRemap.Add(index);
                linkRest.Remove(index);
                TxLinkHandle link = links[index];
                doesntAffect.Add(link.node0);
                doesntAffect.Add(link.node1);
                doesAffect.Remove(link.node0);
                doesAffect.Remove(link.node1);
            }
            doesAffect.Clear();
            doesAffect.AddRange(doesntAffect);
            doesntAffect.Clear();
        }
        return(linkRemap.ToArray());
    }
Exemplo n.º 7
0
 public void DeleteNode(int _index, DestroyFn destroyFn = null)
 {
     if (destroyFn != null)
     {
         destroyFn(nodes[_index]);
     }
     else
     {
         DestroyImmediate(nodes[_index]);
     }
     for (int i = _index + 1; i < nodes.Length; ++i)
     {
         TxNodeHandle node = nodes[i];
         nodes[--node.index] = node;
     }
     System.Array.Resize(ref nodes, nodes.Length - 1);
     foreach (TxTruss.NamedSet s in trussData.nodesSet)
     {
         List <int> newIndices = new List <int>();
         for (int i = 0; i < s.indices.Length; ++i)
         {
             if (s.indices[i] < _index)
             {
                 newIndices.Add(s.indices[i]);
             }
             else if (s.indices[i] > _index)
             {
                 newIndices.Add(s.indices[i] - 1);
             }
         }
         s.indices = newIndices.ToArray();
     }
     for (int i = links.Length - 1; i >= 0; --i)
     {
         TxLinkHandle link = links[i];
         if (link.node0 == _index || link.node1 == _index)
         {
             DeleteLink(i, destroyFn);
         }
         else
         {
             if (link.node0 > _index)
             {
                 --link.node0;
             }
             if (link.node1 > _index)
             {
                 --link.node1;
             }
         }
     }
     for (int i = faces.Length - 1; i >= 0; --i)
     {
         TxFaceHandle face = faces[i];
         if (face.node0 == _index || face.node1 == _index || face.node2 == _index)
         {
             DeleteFace(i, destroyFn);
         }
         else
         {
             if (face.node0 > _index)
             {
                 --face.node0;
             }
             if (face.node1 > _index)
             {
                 --face.node1;
             }
             if (face.node2 > _index)
             {
                 --face.node2;
             }
         }
     }
 }