internal void AddVertex(Scripts.TempMesh mesh_non_node, ref Vertex128 vertex) { if (!Building) { return; } TempMesh128 iter; uint iter_pos; var equator = Scripts.TempMesh.Equator; // note that this starts at last on purpose. the nodes are a ring. for (iter = TempMeshes.last, iter_pos = TempMeshes.count; 0 != iter_pos; iter = iter.next, --iter_pos) { if (iter.hashCode == mesh_non_node.hashCode && equator.Equals(ref iter.value, ref mesh_non_node.value)) { break; } } if (0 == iter_pos) { // need a new mesh. var references = new TempMesh128References { bmp = mesh_non_node.references.bmp, }; TempMesh128.Add(ref TempMeshes, ref mesh_non_node.value, ref references); iter = TempMeshes.last; } else if (iter_pos != TempMeshes.count) { // spin it around a bit to optimize following vertices. TempMeshes.first = iter.next; TempMeshes.last = iter; } TempVertex128.Add(ref iter.references.list, ref vertex); }
internal Dictionary <TempVertex128, TempVertex128> Build(Dictionary <TempVertex128, TempVertex128> temp = null) { if (this.Building) { this.Building = false; var List = this.TempMeshes; this.TempMeshes = default(TempMesh128.List); try { var Iter = List.first; var Pos = List.count; while (0 != Pos--) { var New = new GeoMesh(this, Iter, ref temp); Iter = Iter.next; if (0 == Count++) { New.Next = New; First = New; } else { Last.Next = New; New.Next = First; } Last = New; DrawLayerMask |= (byte)(1 << (New.Material.drawLayerBillboard & 7)); } } finally { TempMesh128.Free(ref List); } } return(temp); }