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(); } }
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); }
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(); }
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); }
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; } }
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()); }
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; } } } }